HDU1024 Max Sum Plus Plus //DP
2016-05-05 12:19
363 查看
题目链接
题意:给一列数,从这列数找出m个互不相交的区间,求这m个区间里的数相加的最大和。
建立dp状态dp[i][j],代表到第i个数时分了j段,并且第j段包含第i个数的最优解;
所以状态转移方程为:dp[i][j]=Max(dp[i-1][j]+a[i] , max( dp[k][j-1] ) + a[i] ) 0<k<i ;
可以画一个矩阵去模拟一下过程去理解,用这个方程推是O(n^3)的复杂度; 可以用另外的一个数组(我用的temp)在计算dp[k][j-1]的值的时候记录下max(dp[k][j-1]),0<k<i的值; (temp[j-1]=max(temp[j-1],dp[k][j-1]); 这样时间复杂度就变为了O(n^2); 而且这样dp[i][j]就只和 dp[i-1][j]与temp[j-1]有关,所以用滚动数组,或则一维数组就可以实现状态转移,dp数组的空间复杂度就降到了O(2n)或O(n);
具体细节请阅读代码
题意:给一列数,从这列数找出m个互不相交的区间,求这m个区间里的数相加的最大和。
建立dp状态dp[i][j],代表到第i个数时分了j段,并且第j段包含第i个数的最优解;
所以状态转移方程为:dp[i][j]=Max(dp[i-1][j]+a[i] , max( dp[k][j-1] ) + a[i] ) 0<k<i ;
可以画一个矩阵去模拟一下过程去理解,用这个方程推是O(n^3)的复杂度; 可以用另外的一个数组(我用的temp)在计算dp[k][j-1]的值的时候记录下max(dp[k][j-1]),0<k<i的值; (temp[j-1]=max(temp[j-1],dp[k][j-1]); 这样时间复杂度就变为了O(n^2); 而且这样dp[i][j]就只和 dp[i-1][j]与temp[j-1]有关,所以用滚动数组,或则一维数组就可以实现状态转移,dp数组的空间复杂度就降到了O(2n)或O(n);
具体细节请阅读代码
#include<iostream> #include<algorithm> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<climits> #define LL long long #define maxn 1100000 #define INF LLONG_MAX/2 using namespace std; int arr[maxn]; LL dp[maxn]; LL temp[maxn]; int main() { int m,n; while(~scanf("%d%d",&m,&n)) { for(int i=1;i<=n;++i) { dp[i]=-INF; temp[i]=-INF; scanf("%d",&arr[i]); } dp[0]=0; temp[0]=0; LL ans=-INF; for(int i=1;i<=n;++i) { for(int j=1; j<=i&& j<=m;++j)//当j>i,或j>m时并没有意义,所以舍弃; { dp[j]=max(dp[j]+arr[i],temp[j-1]+arr[i]); temp[j-1]=max(temp[j-1],dp[j-1]);//根据状态的先后顺序,发现现在的temp[j]不能更新,只能更新temp[j-1],这样都推迟一个状态更新; if(j==m || j==i) //以后计算dp[i+1][j+1]的时候需要temp[j]的值,所以手动更新一下; temp[j]=max(temp[j],dp[j]); if(j==m) ans=max(ans,dp[j]); } } printf("%lld\n",ans); } }
相关文章推荐
- 卷积码
- 489 - Hangman Judge
- Java 容器(三) Set
- LeetCode 256. Paint House
- 卡特兰数
- 用PHP将网页上的Canvas图像保存到服务器上的方法
- Javascript函数----操作DOM文档对象模型
- 从一个队列中取出一个元素再放回去同时保持原来的顺序,不申请非必需的空间存储队列中的元素
- ARC下OC对象和CF对象之间的桥接(bridge)
- django ATOMIC_REQUESTS
- android:ViewPager自动轮播图(简单版)
- 机器学习----SVM(2)从原始问题到对偶问题的转换
- PHP Warning之max_input_vars
- Node.js express NPM start error, Exit Status 8
- Swift-字典
- Python实现HTTP-Basic认证登陆
- 《java入门第一季》之面向对象(继承)
- JAVA邮件发送的简单实现
- 《java入门第一季》之面向对象(继承)
- 第十七章读书笔记