Codeforces Round #267 (Div. 2) C. George and Job dp

C. George and Job
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

The new ITone 6 has been released recently and George got really keen to buy it. Unfortunately, he didn't have enough money, so George was going to work as a programmer. Now he faced the following problem at the work.

Given a sequence of n integers p1, p2, ..., pn. You are to choose k pairs of integers:

 

[l1, r1], [l2, r2], ..., [lk, rk] (1 ≤ l1 ≤ r1 < l2 ≤ r2 < ... < lk ≤ rk ≤ nri - li + 1 = m), 

in such a way that the value of sum  is maximal possible. Help George to cope with the task.

Input

The first line contains three integers nm and k (1 ≤ (m × k) ≤ n ≤ 5000). The second line contains n integers p1, p2, ..., pn(0 ≤ pi ≤ 109).

Output

Print an integer in a single line — the maximum possible value of sum.

Examples
input
5 2 1
1 2 3 4 5
output
9
input
7 1 3
2 10 7 18 5 33 0
output
61

 题意:找到k个区间大小为m的区间和最大值;

   思路:dp[i][t]=max(dp[i-1][t],dp[i-y][t-1]+sum[i-y+1]);

           取以第i个为区间结尾的区间;

#include<bits/stdc++.h>
using namespace std;
#define ll __int64
#define mod 1000000007
#define esp 0.00000000001
const int N=5e3+10,M=1e6+10,inf=1e9;
ll dp[N][N];
ll a[N];
ll sum[N];
int main()
{
    int x,y,z,i,t;
    scanf("%d%d%d",&x,&y,&z);
    for(i=1;i<=x;i++)
    scanf("%lld",&a[i]);
    for(i=1;i<=x-y+1;i++)
    for(t=i;t<=i+y-1;t++)
    sum[i]+=a[t];
    for(i=1;i<=x;i++)
    {
        for(t=1;t<=z;t++)
        {
            if(i>=y)
            dp[i][t]=max(dp[i-1][t],dp[i-y][t-1]+sum[i-y+1]);
            else
            dp[i][t]=dp[i-1][t];
        }
    }
    printf("%lld\n",dp[x][z]);
    return 0;
}

 

posted @ 2016-07-02 16:19  jhz033  阅读(246)  评论(0编辑  收藏  举报