
闫式dp分析法
状态表示f[i][j]:表示在前i个数中选,且包含第i个数,一共j个数的所有集合,属性:max
状态计算:
f[i][j]:当前第j个点已经在第i个位置,那么第j-1个点与第j个点之间的点数个数应该不大于k,那么假设倒数第二个点
即第j-1个点的下标是t 则 i-k<=t<i
那么f[i][j]=max(f[i][j],f[t][j-1]+a[i]) t=>(i-k<=t<i)
最后的结果是在n-k+1 ~ n之间选择一个最后一个点取最大值即可
题解出处
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 210;
LL a[N],dp[N][N];
int main(){
int n,k,x;
cin>>n>>k>>x;
for(int i=1;i<=n;i++) cin>>a[i];
memset(dp,-0x3f,sizeof dp);
dp[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=x;j++)
for(int r=max(0,i-k);r<i;r++)
dp[i][j]=max(dp[i][j],dp[r][j-1]+a[i]);
LL ans=-1;
for(int i=n-k+1;i<=n;i++) ans=max(ans,dp[i][x]);
cout<<ans;
return 0;
}