hdu1024 Max Sum Plus Plus
来源:互联网 发布:三角木马淘宝 编辑:程序博客网 时间:2024/05/22 12:06
题意:
给定一个数组,求其分成m个不相交子段和最大值。
思路:
dp[i][j]表示数组前j个数分成i段的话的最大值,状态的转移如下:dp[i][j]=max(dp[i][j-1],dp[i-1][k])+a[j] ,考虑到这里的数组最大为1e7,所以只是一般的写二维数组肯定爆的,于是采用滚动数组,就是每一个j记录前一次状态的最大值,具体的过程看了代码就懂了。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define inf 999999999using namespace std;int a[1000005];int now[1000005];int pre[1000005];int main(){ int n,m; while(scanf("%d%d",&m,&n)!=EOF) { memset(a,0,sizeof(a)); memset(now,0,sizeof(now)); memset(pre,0,sizeof(pre)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); long long maxx; for(int i=1;i<=m;i++) { maxx=-inf;//必须是每一次分段都更新 for(int j=i;j<=n;j++)//这里j从i开始因为分成i段,那么j至少应该大于等于i { now[j]=max(now[j-1],pre[j-1])+a[j]; //pre[j-1]表示max(dp[i-1][k]) pre[j-1]=maxx;//这里应该能让人理解为什么在每一次i时将maxx初始化一次,因为此时是i的范围内的更新 if(now[j]>maxx) maxx=now[j]; } } printf("%I64d\n",maxx); }}
阅读全文
0 0
- hdu1024-Max Sum Plus Plus
- hdu1024 Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- HDU1024--Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- hdu1024 Max Sum Plus Plus
- hdu1024---Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- hdu1024 Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus
- hdu1024 Max Sum Plus Plus
- Max Sum Plus Plus||HDU1024
- HDU1024-Max Sum Plus Plus
- hdu1024 Max Sum Plus Plus
- HDU1024 Max Sum Plus Plus 【DP】
- HDU1024 Max Sum Plus Plus(DP)
- 【浏览器】Firefox那些事——扩展、插件、脚本、附加组件
- vsftpd基于pam_mysql的虚拟用户认证
- linux 技巧:使用 screen 管理你的远程会话
- 深入浅出AQS之条件队列
- 警告: Exception encountered during context initialization
- hdu1024 Max Sum Plus Plus
- RIAD工作原理
- 两种遍历List的方式
- JAVA语言是值传递还是引用传递
- OpenStack--网络环境实践(一)
- OpenStack--网络环境实践(二)
- 51nod 1366 贫富差距(最短路)
- rapidjson解析json代码实例以及常见的json core dump问题
- poj 2391 Ombrophobic Bovines