题目:https://codeforces.com/contest/1077/problem/F1
题意:
你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x 表示你要从中选出刚好x幅画,并且相邻选的两幅画之间没选画的个数不能≥k,求好看程度之和最大能多少
题解:
我选了第i 副画,那么我接下来的k副画是都可以选的,定义状态为,前i副画我选了j个,第i副画为必须选的画
然后扫一遍必须选x副画后可以得到的最大值是多少
转移方程:
dp[i][j]=max(dp[i][j-1]+a[i],dp[i][j]);
代码如下:
#include<bits/stdc++.h> using namespace std; const int maxn = 205; const int INF=0x3f3f3f3f; typedef long long ll; ll dp[maxn][maxn]; int a[maxn]; int main(){ int n,k,x; scanf("%d%d%d",&n,&k,&x); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,-1*INF,sizeof(dp)); dp[0][0]=0; for(int i=1;i<=n;i++){ for(int j=i-1;j>=max(i-k,0);j--){ for(int m=1;m<=x;m++){ //第i个选了j个后第i个必须选的值是多少 dp[i][m]=max(dp[j][m-1]+a[i],dp[i][m]); } } } ll ans=-1; //第x个必须选的最大值即是答案 for(int i=n;i>n-k;i--){ if(dp[i][x]) ans=max(ans,dp[i][x]); } cout<<ans<<endl; }