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

来源:互联网 发布:淘宝消保加入步骤图 编辑:程序博客网 时间:2024/04/28 11:14

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.

Sample test(s)
input
5 2 11 2 3 4 5
output
9
input
7 1 32 10 7 18 5 33 0
output
61


dp[i][j] 代表前i个数凑j对一共最多能达到多少。

有两种选择,一种是当前数不选,一种是选择当前数。

/***********************************************\ |Author: YMC |Created Time: 2014/9/19 21:01:18 |File Name: c.cpp |Description: \***********************************************/#include <iostream>#include <cstdio>#include <cmath>#include <cstdlib>#include <string>#include <cstring>#include <algorithm>#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#define L(rt) (rt<<1)#define R(rt) (rt<<1|1)#define mset(l,n) memset(l,n,sizeof(l))#define rep(i,n) for(int i=0;i<n;++i)#define maxx(a) memset(a, 0x3f, sizeof(a))#define zero(a) memset(a, 0, sizeof(a))#define srep(i,n) for(int i = 1;i <= n;i ++)#define MP make_pairconst int inf=0x3f3f3f3f ;const double eps=1e-8 ;const double pi=acos (-1.0);typedef long long ll;using namespace std;#define N 5005int n,m,k;ll da[N];ll sum[N];ll dp[N][N];int main() {//freopen("input.txt","r",stdin);     while(~scanf("%d%d%d",&n,&m,&k)) {        sum[0] = 0;        srep(i,n){            scanf("%I64d",&da[i]);            sum[i] = sum[i-1] + da[i];        }        dp[0][0] = 0;        ll ans = 0;        srep(i,n){            srep(j,k){                if(i - m < 0) continue;                dp[i][j] = max(dp[i][j],dp[i-1][j]);                dp[i][j] = max(dp[i-m][j-1] + sum[i] - sum[i-m],dp[i][j]);                if(j == k) ans = max(ans,dp[i][j]);            }        }        cout<<ans<<endl;    }return 0;}


0 0