HDU 1244 Max Sum Plus Plus Plus
题意:
给定一个由n个正整数组成的整数序列
a1 a2 a3 ... an
求按先后次序在其中取m段长度分别为l1、l2、l3...lm的不交叠的连续整数的和的最大值。
a1 a2 a3 ... an
求按先后次序在其中取m段长度分别为l1、l2、l3...lm的不交叠的连续整数的和的最大值。
分析:
dp[i][j]表示前i个数中选j段所能构成的最大值
dp[i][j]=max(dp[i-1][j], dp[i-len[j]][j-1]+sum) len[j]表示第j段的长度,sum表示长度为len[j]的连续序列的和。
//dp[i][j]表示前i个数中选j段所能构成的最大值 //dp[i][j]=max(dp[i-1][j], dp[i-len[j]][j-1]+sum) len[j]表示第j段的长度,sum表示长度为len[j]的 //连续序列的和。 #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int sum[1001]; int len[20]; int a[1001]; int dp[1001][22]; int main() { int n, m, i, j, k; while (scanf("%d",&n),n) { scanf("%d",&m); for (i=1; i<=m; i++) scanf("%d",&len[i]); for (i=1; i<=n; i++) scanf("%d",&a[i]); sum[0] = 0; sum[1] = a[1]; for (i=2; i<=n; i++) sum[i] = sum[i-1]+ a[i]; memset(dp,0,sizeof(dp)); for (i=1; i<=n; i++) { for (j=1; j<=m && j<=i; j++) { dp[i][j] = max(dp[i][j],dp[i-1][j]); if (i >=len[j]) dp[i][j] = max(dp[i][j],dp[i-len[j]][j-1]+sum[i]-sum[i-len[j]]); } } printf("%d\n",dp[n][m]); } return 0; }