题目链接:http://codeforces.com/problemset/problem/1077/F1
题意:从n个物品中挑选x个物品,每个物品都有一个价值,我们想选出的价值尽量大,还有保证任意连续的k个物品中都
至少有一个物品被选出来.
思路:既然我们想选择x个物品,我们就可以令f[i][j]表示选择以第i个物品结尾的j个物品的最大价值.
这样更新的话f[i][j] = max(f[l][j-1]+a[i]) ,i-l< k.
优化见另一题.
代码:
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const int maxn = 2e5+5;
const double eps = 1e-12;
const int inf = 0x3f3f3f3f;
map<int,int>::iterator it;
int n,k,m;
ll a[1234];
ll f[234][234];
int main()
{
cin>>n>>k>>m;
for(int i = 1;i<= n;i++)
cin>>a[i];
for(int i = 0;i<= n;i++)
for(int j = 0;j<= n;j++)
f[i][j] = -1e15;
for(int i = 1;i<= n;i++)
{
if(i<= k)
f[i][1] = a[i];
for(int j = 2;j<= i;j++)
{
for(int l = i-1;l>= i-k&&l> 0;l--)
{
f[i][j] = max(f[i][j],f[l][j-1]+a[i]);
}
}
}
ll ans = -1e15;
for(int i = n;i>= n-k+1;i--)
ans = max(ans,f[i][m]);
if(ans< 1)
cout<<-1<<"\n";
else
cout<<ans<<endl;
return 0;
}