简单dp之——m段子序列的最大和
来源:互联网 发布:速达3000软件 编辑:程序博客网 时间:2024/06/06 06:25
题目:hdu1024
题意:m:分成m段。n:数组长度。给定一个数组求m段子区间的最大和
解答:dp[i][j]:前j个数分成i组的最大子区间和。
1、状态转移方程:dp[i][j] = max(dp[i][j-1] + a[j],max(dp[i-1][k](0 < k < j) ) + a[j])//前者:包含在第i组里,后者:独立成第i组
2、优化成一维的。
(1)将i放入外层循环当中
(2)如何求max(dp[i-1][k])?
dp[i-1][k]相当于上一轮(i-1)从dp(一维)[i-1]到dp[j-1]中的最大值,用t数组记录
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int MAXN = 1000000 + 100;const int INF = 0x7fffffff;int a[MAXN],dp[MAXN],t[MAXN];int temp,m,n;int main(){ while(~scanf("%d%d",&m,&n)) { for(int i = 1;i <= n;i++) { scanf("%d",&a[i]); t[i] = 0; dp[i] = 0; } t[0] = 0; dp[0] = 0; for(int i = 1;i <= m;i++) { temp = -INF;//每进入新的一轮就要初始化为最小以便求该轮的最大值 for(int j = i;j <= n;j++) { dp[j] = max(dp[j-1] + a[j],t[j-1] + a[j]); t[j-1] = temp;//求完dp[j]再更新 temp = max(temp,dp[j]); } } int ans = -INF; for(int i = m;i <= n;i++) if(dp[i] > ans) ans = dp[i]; printf("%d\n",ans); } return 0;}
0 0
- 简单dp之——m段子序列的最大和
- (5)最大m段子序列和问题____动态规划
- HDOJ1024(m段子序列最大和模板题)
- hdu1024 Max Sum Plus Plus(M段子序列的最大和)
- k个最大的m段子数组和
- 南阳oj742子串和在续(最大m段子序列和+动态规划)
- hdu1024 最大M段子段和
- hdu1024(m段子段和最大)
- hdu 1024 Max Sum Plus Plus(最大m段子序列和)
- 和最大的子序列(简单dp)
- 经典动态规划——HDU1024 m段子段和的最大值
- hdu Max Sum Plus Plus(最大m段子段和)
- hdu Max Sum Plus Plus(最大m段子段和)
- HDU 1024 m段子段和最大值 (DP)
- hdu——1003(dp之最大子序列和 )
- DP之简单的求最大字段和问题
- ACM-DP之最大连续子序列——hdu1231
- [DP动归]-POJ-2479-最大两段子串和
- ora 600[ktspfmdb:objdchk_kcbnew_3] [0], [6059381], [4]
- JS保留两位小数 四舍五入函数
- Python零基础入门之六python函数
- 小娜老师的讲义-搭建私人镜像
- iOS UIViewController 和 xib 绑定 详解
- 简单dp之——m段子序列的最大和
- Apache Spark
- 友(→_→)情链接
- Java Study1-eclipse不自动弹出提示(alt+/快捷键失效)
- POJ - 2955 Brackets 区间DP
- 如何实现提示信息又可以刷新界面的实现
- 表与表之间的关系
- 数据库PDO、mysqli扩展与数据库交互
- Android开发的权限大全