HDU1024->线性DP
2016-08-18 12:44
204 查看
HDU1024->线性DP
题意:求一个有n个元素的序列,划分出m个子序列,求这m个子序列的最大和。
题解:
dp[i][j]代表前j个数选i个子序列,能得到的最大和。
决策为:第j个数,是在第包含在第i组里面,还是自己独立成组。
状态转移方程:
dp[i][j]=max(dp[i][j-1]+num[j],dp[i-1][k]+num[j]) ;
由于采用二维数组,空间复杂度过高,所以采用滚动数组的方式优化。
代码:
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; #define MAX 1000005 #define INF 0x3f3f3f3f int dp[MAX] ; int num[MAX] ; int pre[MAX] ; int main() { int n , m ; int i , j , temp ; while(scanf("%d%d" , &m , &n)!=EOF) { for(i = 1 ; i <= n ; i ++) { scanf("%d" , &num[i]) ; } memset(dp , 0 , sizeof(dp)) ; memset(pre , 0 , sizeof(pre)) ; for(i = 1 ; i <=m ; i ++) { temp = -INF ; for(j = i ; j <= n ; j ++) { dp[j] = max(dp[j-1]+num[j],pre[j-1]+num[j]); pre[j -1] = temp ; temp = max(temp , dp[j]) ; } } printf("%d\n" , temp) ; } return 0; }
相关文章推荐
- 线性dp<一>
- UVALive6908->线性DP
- UVA10128->线性DP
- HDU 3455 Leap Frog(线性DP)
- 算法线性编程珠玑读书笔记之----->使用线性算法求解连续子序列的最大和
- light oj 1031 - Easy Game(区间DP->轮流取值的最大差值)
- UVA10440->贪心||DP
- POJ 1163 The Triangle (线性dp)
- POJ 2479 - Maximum sum(线性DP)
- HDU2089->数位DP
- HDU 5106 Bits Problem(数位DP->二进制大数模拟)@
- HDU1024 DP的优化 最大M子段和问题
- [bzoj 2726] 任务安排 (斜率优化 线性dp)
- HDU - 2154 线性dp
- BZOJ1009 [HNOI2008]GT考试(KMP算法+矩阵加速dp)
- UVA 607 - Scheduling Lectures (线性dp)
- hdu--2546--dp<01背包>
- HDU 2845 Beans (两次线性dp)
- ACM日记①埃筛法-&gt;欧拉线性筛法
- (vijos 1892 noip 模拟 tree)<树形DP求树的最大匹配及方案数>