HDU 1024 DP Max Sum Plus Plus
题意:本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题。
kuangbin专题。
dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + a[j] ) 0<k<j
注意可以换成一维数组。第一维i没有影响,我们要求dp[m][n],所以i维可以省去,每次保留前j-1个数之中最大的部分。
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8 #include<vector> 9 #include<cstring> 10 #include<stack> 11 #include<cmath> 12 #include<queue> 13 #include <bits/stdc++.h> 14 using namespace std; 15 #define INF 0x3f3f3f3f 16 #define LL long long 17 #define clc(a,b) memset(a,b,sizeof(a)) 18 int a[1000010]; 19 int dp[1000010]; 20 int maxn[1000010]; 21 int main() 22 { 23 int m,n; 24 while(~scanf("%d%d",&m,&n)) 25 { 26 for(int i=1; i<=n; i++) 27 { 28 scanf("%d",&a[i]); 29 } 30 clc(dp,0); 31 clc(maxn,0); 32 int maxx; 33 for(int i=1; i<=m; i++) 34 { 35 maxx=-INF; 36 for(int j=i; j<=n; j++) 37 { 38 dp[j]=max(dp[j-1]+a[j],maxn[j-1]+a[j]); 39 maxn[j-1]=maxx; 40 maxx=max(maxx,dp[j]); 41 } 42 } 43 printf("%d\n",maxx); 44 } 45 return 0; 46 }