Codeforces 467C. George and Job (dp)

时间:2023-03-08 23:25:47
Codeforces 467C. George and Job (dp)

题目链接:http://codeforces.com/contest/467/problem/C

求k个不重叠长m的连续子序列的最大和。

dp[i][j]表示第i个数的位置个序列的最大和。

前缀和一下就好了。空间可以优化,滚动数组就好了。

 //#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = 5e3 + ;
LL dp[N][];
LL sum[N]; int main()
{
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
for(int i = ; i <= n; ++i) {
scanf("%lld", sum + i);
sum[i] += sum[i - ];
}
for(int j = ; j <= k; ++j) {
for(int i = m*j; i <= n; ++i) {
dp[i][j%] = max(dp[i - m][(j - )%] + sum[i] - sum[i - m], dp[i - ][j%]);
}
}
printf("%lld\n", dp[n][k%]);
return ;
}