AcWing 周赛 C题 4418. 选元素

闫式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;
}

本文作者:xhy666

本文链接:https://www.cnblogs.com/xhy666/p/16246323.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   xhy666  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起