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:
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
Copy
5 2 1 1 2 3 4 5
output
Copy
9
input
Copy
7 1 3 2 10 7 18 5 33 0
output
Copy
61
题意:
给定一个序列,分成k个m长度的连续区间,取其中若干个相邻区间,使所取范围内的元素之和最大,求出最大值。
代码:
#include<bits/stdc++.h>
/*#include<iostream>
#include<stdio.h>
#include<ctype.h>
#include<string>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<climits>
#include<vector>
#include<map>
#include<queue>*/
#define LL long long
#define inf 0x7f7f7f7f
const int N=10000;
using namespace std;
/*dp[i][j]表示取到第i个元素取时j*m长度的区间和的最大值
则dp[i][j]可等于dp[i][j],或者由dp[i-m][j-1]加上一个区间得出,就看哪个值大*/
LL dp[5050][5050];
LL a[N];//原序列
LL s[N];//前缀和
int main()
{
int n,m,k;
LL ans=0;
cin>>n>>m>>k;
//生成前缀和,第i个区间的元素之和就可以表示为s[i]-s[i-m]
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=s[i-1]+a[i];
}
for(int i=m;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
//状态转移方程
dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+s[i]-s[i-m]);
}
ans=max(ans,dp[i][k]);
}
cout<<ans;
}