POJ 1976

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

题解: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 }

你可能感兴趣的:(poj)