题意:一维序列,用三个相等长度区间区覆盖,使得覆盖的权值最大
题解:dp[i][j]为前i个数用j个区间覆盖的最大值,状态转移分为覆盖第i个数和不覆盖第i个数两种。

1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int dp[50005][4],sum[50005]; 6 int main() 7 { 8 int T; 9 for(scanf("%d",&T);T;T--) 10 { 11 int n,m; 12 scanf("%d",&n); 13 memset(dp,0,sizeof(dp)); 14 sum[0]=0; 15 for(int i=1,tp;i<=n;i++) 16 { 17 scanf("%d",&tp); 18 sum[i]=sum[i-1]+tp; 19 } 20 scanf("%d",&m); 21 for(int i=1;i<=n;i++) 22 { 23 for(int j=1;j<=3;j++) 24 { 25 if(i<=m*j) 26 dp[i][j]=sum[i]; 27 else 28 dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+sum[i]-sum[i-m]); 29 } 30 } 31 printf("%d\n",dp[n][3]); 32 } 33 return 0; 34 }