NYOJ 742 —— 最大m段和 【区间DP】
来源:互联网 发布:新手怎样做淘宝客 编辑:程序博客网 时间:2024/06/05 00:18
经典区间DP:最大m段和
“最大连续和问题”是最大m段和问题的一个特例,其实是当m=1的一种特殊情况。
OJ题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=742
#include <iostream>#include <cstdio>#define INF 0x3f3f3f3fusing namespace std;const int MAXN = 1000000 + 5;typedef long long LL;int a[MAXN];LL dp[MAXN];LL maxn[MAXN];/* dp[i][j] = max(dp[i][j-1]+a[j], max(dp[i-1][k])+a[j]) (i-1 <= k < j)
下面的代码进行了两个很重要的优化:1.滚动数组,空间减少一维 2. 通过动态维护上一行中[i-1,j)的最大值,省去k的一重循环*/int main (){ int T, m, n; scanf("%d", &T); while(T--) { scanf("%d%d", &m, &n); for(int i=1; i<=n; i++) { scanf("%d", &a[i]); } for(int j=0; j<=n; j++) maxn[j] = dp[j] = 0; LL t; for(int i=1; i<=m; i++) { t = -INF; for(int j=0; j<=n; j++) {
// 把j个数分成比j还多的段,这是不合法的 if(i>j) dp[j] = -INF; else { dp[j] = max(dp[j-1]+a[j], maxn[j-1]+a[j]); // maxn[j-1]已经被使用完毕,所以可以赋值了 maxn[j-1] = t; // t保存第i行、i~j列的最大dp值, // 但是t不能马上赋值给maxn[j],因为下一次循环到j+1时,要用到原来的maxn[j] t = max(t, dp[j]); } } } printf("%lld\n", t); } return 0;}
参考:
http://blog.csdn.net/liufeng_king/article/details/8632430
0 0
- NYOJ 742 —— 最大m段和 【区间DP】
- NYOJ 746 - 正整数n划分为m段,求m段的最大乘积 【区间DP】
- 51nod 1052 最大M子段和 (区间dp)
- DP最大M子段和
- hdu1024 最大m段和 划分dp
- nyoj 104 最大和 【区间dp】
- 【dp】51nod 1052 最大M子段和
- 【DP】51Nod 1052 最大M子段和
- HDU1024 DP的优化 最大M子段和问题
- 【51nod】1052 最大M子段和 DP
- 【51Nod】1052 最大M子段和 DP
- 51 nod 1052 最大M子段和(DP)
- 51nod 1052 最大m子段和 DP
- 17089 最大m子段和(scauoj、dp动态规划)
- dp之最大和,m段最大和以及最大子矩阵
- NYOJ - 最大和(DP)
- 最大m子段和
- 最大m子段和
- NYOJ 571 —— 各种划分数
- NYOJ 651 —— n划分为2个以上不同正整数的划分个数
- 卡特兰数
- NYOJ 1103 —— m划分为n个正整数的个数
- Sicily - 17958 - Algorithm Lectures 【找规律】
- NYOJ 742 —— 最大m段和 【区间DP】
- tyvj 1305 —— 长度不超过m的最大连续和 【前缀和+单调队列】
- Android 开发实战经验总结
- HDU 2746 ——Max Sum Plus Plus Plus 【dfs+带备忘 或 DP】
- Sicily - Water 【寻找规律】
- POJ 3783 ——Balls 【DP】
- Java集合类的继承关系
- HDU 1846 —— Brave Game
- HDU 2147 —— kiki's game