标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24675 Accepted Submission(s): 8478
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 #define N 1000005 7 #define INF -1000000000 8 int num[N],dp[N],mmax[N]; 9 /* 10 状态DP[i][j] 11 前j个数可以分成i组的和的最大值 12 DP[i][j]=max(dp[i][j-1]+num[j], max( dp[i-1][k] )+num[j]),0<k<j; 13 dp[i][j-1]是把num[j]加入到前面的一个组, 14 max(dp[i-1][k])+num[j]是把num[j]重新分在另一个组里面, 15 而max(dp[i-1][k])是分成i-1个组时候的和的最大值 16 开一个mmax数组每次都可以保存分成i-1个组的时候使用前j-1个数时候最大值 17 时间复杂度O(mn) 18 */ 19 int main() 20 { 21 int n,m; 22 while(~scanf("%d%d",&m,&n)){ 23 for(int i=1;i<=n;i++){ 24 scanf("%d",num+i); 25 } 26 memset(dp,0,sizeof(dp)); 27 memset(mmax,0,sizeof(mmax)); 28 int ans; 29 for(int i=1;i<=m;i++){ 30 ans=INF; 31 for(int j=i;j<=n;j++){ 32 dp[j]=max(dp[j-1],mmax[j-1])+num[j]; 33 mmax[j-1]=ans; 34 ans=max(dp[j],ans); 35 } 36 } 37 cout<<ans<<endl; 38 } 39 return 0; 40 }
2016-06-21
HDU 1024:Max Sum Plus Plus(DP)
标签:
原文地址:http://www.cnblogs.com/fightfordream/p/5602302.html