题意:一维序列,用三个相等长度区间区覆盖,使得覆盖的权值最大

题解:dp[i][j]为前i个数用j个区间覆盖的最大值,状态转移分为覆盖第i个数和不覆盖第i个数两种。

View Code
 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 }