hdu1024
dp[i][j]表示前j个分组成i个组的最大和,状态转移方程为dp[i][j]=dp[i][j-1]+num[j]>dp[i-1][j-1]+num[j]?dp[i][j-1]+num[j]:dp[i-1][j-1]+num[j]表示:
当前有2种状态,第j个数放进第i个组,或者是第j个数重新做第i组的第一个数(这时dp[i][j]等于这个数加上第i-1组j-1前最大的和),但是n很大,可以用滚动数组,于是要用另外一个数组存储第i-1组j-1前最大的和
#include <stdio.h> #include<limits.h> int num[1000005]; int max1[1000005]; int dp[1000005]; int main(int argc, char *argv[]) { int n,m; while (scanf("%d %d",&m,&n)!=EOF) { int i,j; for(i=1;i<=n;i++) { scanf("%d",&num[i]); max1[i]=0; dp[i]=0; } max1[0]=0; dp[0]=0; int max; for(i=1;i<=m;i++) { max=-1*(INT_MAX-1); for(j=i;j<=n;j++) { dp[j]=dp[j-1]+num[j]>max1[j-1]+num[j]?dp[j-1]+num[j]:max1[j-1]+num[j]; max1[j-1]=max; max=dp[j]>max?dp[j]:max; } } printf("%d\n",max); } return 0; }