博客
关于我
NC15553 数学考试(线性DP)
阅读量:381 次
发布时间:2019-03-05

本文共 971 字,大约阅读时间需要 3 分钟。

题目描述
今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,qwb并不打算把这些题全做完,
他想选总共2k道题来做,并且期望他能获得的分数尽可能的大,他准备选2个不连续的长度为k的区间,
即[L,L+1,L+2,…,L+k-1],[R,R+1,R+2,…,R+k-1](R >= L+k)。
输入描述:
第一行一个整数T(T<=10),代表有T组数据
接下来一行两个整数n,k,(1<=n<=200,000),(1<=k,2k <= n)
接下来一行n个整数a1,a2,…,an,(-100,000<=ai<=100,000)
输出描述:
输出一个整数,qwb能获得的最大分数
示例1
输入

2

6 3
1 1 1 1 1 1
8 2
-1 0 2 -1 -1 2 3 -1
输出

6

7

思路:dp1【i】表示i左边长度为k的区间的最大值,dp2【i】表示i右边长度为k的区间的最大值,所有总的最大值的话就是max(dp1【i】+dp2【i+1】)。

#include
using namespace std;typedef long long ll;const int maxn=2e5+1; const ll inf=1e18+1;ll t,dp1[maxn],dp2[maxn],sum[maxn],ans=-inf;int main(){ int n,k,T; scanf("%d",&T); while(T--) { ll ans=-inf; scanf("%d %d",&n,&k); for(int i=1;i<=n;++i) scanf("%lld",&t),sum[i]=sum[i-1]+t,dp1[i]=dp2[i]=-inf; for(int i=k;i<=n-k;++i) dp1[i]=max(dp1[i-1],sum[i]-sum[i-k]); for(int i=n-k+1;i>k;--i) dp2[i]=max(dp2[i-1],sum[i+k-1]-sum[i-1]); for(int i=k;i<=n-k;++i) ans=max(ans,dp1[i]+dp2[i+1]); printf("%lld\n",ans); }}

转载地址:http://whewz.baihongyu.com/

你可能感兴趣的文章
安装jdk并配置环境变量
查看>>
稀疏数组
查看>>
js的严格模式
查看>>
ETL工具-KETTLE教程实例实战1----术语和定义
查看>>
idea的安装和无限期试用
查看>>
Oracle VM VirtualBox安装PVE虚拟机
查看>>
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
查看>>
Android MediaPlayer setDataSource failed
查看>>
[Vue 牛刀小试]:第十二章 - 使用 Vue Router 实现 Vue 中的前端路由控制
查看>>
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
查看>>
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
查看>>
如何查看jsplumb.js的API文档(YUIdoc的基本使用)
查看>>
大前端的自动化工厂(1)——Yeoman
查看>>
数据仓库建模方法论
查看>>
数据仓库之拉链表
查看>>
虚拟机搭建hadoop环境
查看>>
redis 删除大key集合的方法
查看>>
DataStax Bulk Loader教程(三)
查看>>
DataStax Bulk Loader教程(四)
查看>>
为何选择云原生?
查看>>