题意:
给n个数将其分成连续的m组,使得这些组的数加和最大,组与组之间可以空数。
/* dp[i][j]表示将前j个数分成i个组最大值 状态转移方程是: dp[i][j]=max(dp[i-1][0...j-1],dp[i][j-1])+tmp[j]; 内存的优化是用滚动数组记录dp[i][...]和dp[i-1][...] 时间的优化是将dp[i-1][...]用dp[i-1][j]=max(dp[i-1][1...j])代替省去一维时间 并不清楚这道题的复杂度怎么算... 坑点: 1.第一次写滚动数组,边界没有设置好。 2.没有有效区分出有意义的状态。 */ #include<stdio.h> #include<string.h> inline int max(int a,int b) { if(a>b) return a; return b; } const int inf=0x7fffffff; int tmp[1000006]; int bf[1000006]; int bbf[1000006]; int main() { int m,n; while(scanf("%d%d",&m,&n)!=EOF) { memset(bf,0,sizeof(bf)); memset(bbf,0,sizeof(bbf)); for(int i=1;i<=n;i++) { scanf("%d",&tmp[i]); } for(int i=1;i<=m;i++) { bf[i-1]=-inf; for(int j=i;j<=n;j++) { bf[j]=max(bbf[j-1],bf[j-1])+tmp[j]; } bbf[i-1]=-inf; for(int j=i;j<=n;j++) { bbf[j]=max(bbf[j-1],bf[j]); } } printf("%d\n",bbf[n]); } }
时间: 2024-10-16 05:05:16