C. George and Job
time limit per test
1 secondmemory limit per test
256 megabytesinput
standard inputoutput
standard outputThe 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:
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 n, m 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 ",dp[x][z]); return 0; }