HDU 1024 Max Sum Plus Plus(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024
题目大意:有多组输入,每组一行整数,开头两个数字m,n,接着有n个数字。要求在这n个数字上,m块数字的最大和。比如2 6 -1 4 -2 3 -2 3,就是(4 -2 3)和(3)这两块最大和为8。
解题思路:当成有m层,我们可以设置两个数组dp,mpre。dp[j]记录当前这一层包含a[j]时的最大值(包含a[j]),mpre[j]个记录上一层到第j-1个位置时的最大和(不一定包含a[j])。这样写出状态转移方程dp[j]=max(dp[j-1],mpre[j-1])+a[j]。表示选择接着这一层j上一个+a[j],或这上一层j-1这个位置取最大值的状态+a[j]。
举个例子2 8 -1 4 -2 3 -10 3 -2 3,在i=2,j=8时,此时dp[8]=max(dp[7],mpre[7])。dp[7]=6表示(4 -2 3)+(3 -2)这两块的和,mpre[7]=5表示(4 -2 3)这一块的和,选择dp[8]=dp[7]+a[j]=0相当于(4 -2 3)+(3 -2 3)这两块的和。
推广一下,在第m层时,mpre[j-1]表示在j-1这个位置m-1块的最大和,如果选择mpre[j-1]+a[j]相当于a[j]为一块,mpre[j-1]为m-1块加起来就是j位置m块时的最大值。
同理dp[j-1]是包含了a[j-1]的在j-1这个位置m块的最大和,如果选择dp[j-1]+a[j]相当于a[j],a[j-1]....一直到上一次选择mpre为止算一块(或者到第m-1个,可能没有选择过mpre),前面的有m-1块,加起来也是j位置m块时的最大值。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e6+;
const LL inf=1e18; LL a[N],dp[N],pre[N]; int main(){
int m,n;
while(~scanf("%d%d",&m,&n)){
memset(dp,,sizeof(dp));
memset(pre,,sizeof(pre));
for(int i=;i<=n;i++)
scanf("%lld",&a[i]);
LL tmp;
for(int i=;i<=m;i++){
tmp=-inf;
for(int j=i;j<=n;j++){
dp[j]=max(dp[j-]+a[j],pre[j-]+a[j]);
pre[j-]=tmp;
tmp=max(tmp,dp[j]);
}
}
printf("%lld\n",tmp);
}
return ;
}
HDU 1024 Max Sum Plus Plus(dp)的更多相关文章
- HDU 1024 Max Sum Plus Plus (动态规划)
HDU 1024 Max Sum Plus Plus (动态规划) Description Now I think you have got an AC in Ignatius.L's "M ...
- HDU 1024 Max Sum Plus Plus(DP的简单优化)
Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To b ...
- HDU 1024:Max Sum Plus Plus(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Problem Description Now I think you ...
- HDU 1024 Max Sum Plus Plus(m个子段的最大子段和)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/ ...
- HDU 1024 Max Sum Plus Plus(基础dp)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDU 1024 Max Sum Plus Plus【DP】
Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...
- HDU 1024 Max Sum Plus Plus (动态规划、最大m子段和)
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 1024 Max Sum Plus Plus(简单dp)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意:给定一个数组,求其分成m个不相交子段和的最大值. 这题有点问题其实m挺小的但题目并没有给出 ...
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意: 给定序列,给定m,求m个子段的最大和. 分析: 设dp[i][j]为以第j个元素结尾的 ...
随机推荐
- Linux内核分析第五周学习总结——分析system_call中断处理过程
Linux内核分析第五周学习总结--分析system_call中断处理过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- 浴谷八连测R4题解
一开始出了点bug能看见排行榜,于是我看见我半个小时就A掉了前两题,信心场QAQ T1字符串题就不说了qwq #include<iostream> #include<cstring& ...
- 万圣节后的早晨&&九数码游戏——双向广搜
https://www.luogu.org/problemnew/show/P1778 https://www.luogu.org/problemnew/show/P2578 双向广搜. 有固定起点终 ...
- 音视频处理之H264编码标准20170906
一. H264基础概念 1.名词解释 场和帧 : 视频的一场或一帧可用来产生一个编码图像.在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场. 片: 每个图象中,若干 ...
- java根据系统生成临时文件
createTempFile 会根据当前系统,自动找系统的临时文件目录,在此目录下生成临时文件
- 【mysql】测试方案整理
http://www.cnblogs.com/callhe/ https://www.digitalocean.com/community/tutorials/how-to-measure-mysql ...
- 正则(?is)
Q:经常看见的正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思?A: 称为内联匹配模式,通常用内联匹配模式代替使用枚举值RegexOptions指定的全局匹配模式,写起来更 ...
- 从一个集合中过滤另一个集合中存在的项(类似in)
直接贴代码出来: List<PriceMark> list = PriceMarkDAL.m_PriceMarkDAL.GetList("Erp_ProName='TLC7528 ...
- 使用L2正则化和平均滑动模型的LeNet-5MNIST手写数字识别模型
使用L2正则化和平均滑动模型的LeNet-5MNIST手写数字识别模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: T ...
- OpenCV---色彩空间(二)HSV追踪颜色对象和通道分离与合并
一:HSV追踪有颜色对象 def inRange(src, lowerb, upperb, dst=None) #lowerb是上面每个颜色分段的最小值,upperb是上面每个颜色分段的最大值,都是列 ...