牛牛的旅游纪念品
创始人
2025-05-29 09:13:08

牛牛在牛市的旅游纪念商店里面挑花了眼,于是简单粗暴的牛牛决定——买最受欢迎的就好了。

但是牛牛的背包有限,他只能在商店的n个物品里面带m个回去,不然就装不下了。

并且牛牛希望买到的纪念品不要太相似,所以导购小姐姐帮助牛牛把纪念品全部排成了一行,牛牛只需要让选出来要买的m个物品中任意两个的位置差都大于等于k就行了。

现在告诉你这n个物品排成一行之后的受欢迎程度(可能是负数),求牛牛带回去的m个物品的最大欢迎度之和。

输入描述:

第一行三个数n,m,k

接下来一行,有n个整数,是n个物品按顺序的受欢迎程度。

输出描述:

输出一个数为题目所求的最大和

输入

复制

4 2 2

2 4 -6 1

输出

复制

5

说明

n≤10000,m≤100,m≤n,答案保证在int范围内,保证按照题目要求一定能取到m个物品

备注:

1

#include
using namespace std;
#define int long long
#define endl '\n'
#define YES cout<<"YES"< PII;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
const int N = 1e4+10;
int a[N];
int dp[10010][110];
#define ios ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
void solve()
{int n,m,k;cin>>n>>m>>k;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++){dp[i][0]=0;for(int j=1;j<=m;j++){dp[i][j]=max(dp[max(0LL,i-k)][j-1]+a[i],dp[i-1][j]);}}cout<

给我了一点灵感,dp[i][j]=max(dp[max(0LL,i-k)][j-1]+a[i],dp[i-1][j]);他这个有状态继承,也就是说第i,j可能和第i-1,j的值是相等的所以我们不用考虑转移状态呢一个范围

我们可以从具体的状态转移过来不太好想其实就是背包问题的变形同样也是对一个位置进行了两个选择,也就是选择或者不选择

而对于可能满足的位置我们进行了状态转移所以只要维护好最前面的就ok

具体见代码把

代码更清晰

相关内容

热门资讯

今年我省粮食产量达515.56... (来源:辽宁日报)转自:辽宁日报 图为在中储粮(盘锦)储运有限公司,装运粮食的重型卡车排起长队...
国家发展改革委部署促进投资止跌... (来源:辽宁日报)转自:辽宁日报 新华社北京12月13日电 (记者魏玉坤) 记者13日从全国发展和改...
江苏省实施《中华人民共和国森林... (来源:新华日报) 目 录 第一章 总则 第二章 森林、林木和林地权属管理...
姜堰数字化产品讲“活”理论 (来源:新华日报) □ 本报记者 卢佳乐 通讯员 姜宣 “王教授,您约我‘喝茶论道’,...
联合国维和部队在苏丹遇袭 6人... 转自:财联社【联合国维和部队在苏丹遇袭 6人死亡】财联社12月14日电,当地时间13日,苏丹武装部队...