HDU 1024 Max Sum Plus Plus(动态规划)
来源:互联网 发布:win7网吧优化工具 编辑:程序博客网 时间:2024/04/29 16:24
这个题是求M段子段和最大的题目....但是范围有100W这么大...昨天虽然没有写题,但是看了这个DP,毕竟DP是主业....图论有点刷不动了...然后当时只想到了O(m*n*n)复杂度的...必定是不行的...写之前想到了一个O(n*n)的....dp[i][j]代表分为i段以j结尾的,所以dp[i][j]=max(dp[i-1][k],dp[i][j-1])+num[j],i-1<=k<j...不会优化...去看了大牛的博客....翻到了优化部分,还是挺好的,附上链接:http://blog.sina.com.cn/s/blog_677a3eb30100jxqa.html
这个题目因为范围过大只能采取滚动数组形式...
#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>#include<iostream>using namespace std;int num[1020000],dp[2][1020000];int main(){ int n,m; while(scanf("%d %d",&m,&n)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&num[i]); dp[0][i]=dp[1][i]=0; } int t=0; for(int i=1;i<=m;i++) { t=t^1; dp[t][i]=dp[t^1][i-1]+num[i]; int maxm=dp[t^1][i-1]; for(int j=i+1;j<=n-m+i;j++)//这个循环要完成i段最大和,最低要剩下n-m+i个数字才能凑够m段... { maxm=max(maxm,dp[t^1][j-1]); dp[t][j]=max(maxm,dp[t][j-1])+num[j]; } } int ans=-0x7fffffff; for(int j=m;j<=n;j++) ans=max(ans,dp[t][j]); printf("%d\n",ans); } return 0;}
0 0
- HDU 1024 Max Sum Plus Plus(动态规划)
- HDU:1024 Max Sum Plus Plus(动态规划)
- HDU 1024 Max Sum Plus Plus 动态规划
- HDU 1024(Max Sum Plus Plus)动态规划
- Hdu 1024 Max Sum Plus Plus 动态规划+滚动数组
- hdu 1024 Max Sum Plus Plus (滚动数组 &&动态规划)
- hdu 1024 Max Sum Plus Plus(动态规划+m子段和的最大值)
- HDU 1024 Max Sum Plus Plus(动态规划 很详很详解)
- 动态规划训练14 [Max Sum Plus Plus HDU
- Max Sum Plus Plus 动态规划
- HDOJ 1024 Max Sum Plus Plus -- 动态规划
- hdoj 1024 Max Sum Plus Plus 【动态规划】
- 杭电1024Max Sum Plus Plus动态规划
- hdu1024 Max Sum Plus Plus(动态规划)
- HDU1024 ——Max Sum Plus Plus(动态规划)
- HDU 1024 Max Sum Plus Plus((最大m段子段和))(动态规划经典)
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
- 杭电OJ——1024 Max Sum Plus Plus(另类的动态规划!)
- Processes and Threads
- 兔子--android电量
- Struts2--基于注解方式Action配置
- SocketServer模块分析
- 【OpenSSL】为Android系统构建OpenSSL
- HDU 1024 Max Sum Plus Plus(动态规划)
- 4.app是怎么炼成的
- LINUX下PHP安装VLD扩展
- 一个经典例子让你彻彻底底理解java回调机制
- javaweb学习总结(四十二)——Filter(过滤器)学习
- Debugging Deadlocks on Android
- HTML基础
- Javascript:消息框的使用
- windows程序窗体创建流程模型A--发送自定义消息逻辑上出现Bug