
NC15553 数学考试(线性DP)
发布日期:2021-05-08 15:19:03
浏览次数:12
分类:精选文章
本文共 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】)。
#includeusing 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); }}
发表评论
最新留言
不错!
[***.144.177.141]2025年04月08日 22时21分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
2019-03-06
用ThreadLocal来优化下代码吧
2019-03-06
netcore中使用session
2019-03-06
Android 开发学习进程0.25 自定义控件
2019-03-06
多媒体文件格式全解说(下)--图片
2019-03-06
淘宝WAP版小BUG分析
2019-03-06
NodeJS+Express+MongoDB
2019-03-06
(四十四)c#Winform自定义控件-水波-HZHControls
2019-03-06
c#winform主题实现的一个方法
2019-03-06
asp.net打印网页后自动关闭网页【无需插件】
2019-03-06
一个人开发的html整站源码分享网站就这么上线了
2019-03-06
SQLServer 查看耗时较多的SQL语句(转)
2019-03-06
【计算机网络】应用层
2019-03-06
【Maven】POM基本概念
2019-03-06
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2019-03-06
【设计模式】单例模式
2019-03-06
【SpringCloud】Hystrix熔断器
2019-03-06
【Linux】2.3 Linux目录结构
2019-03-06
java.util.Optional学习笔记
2019-03-06