牛牛的旅游纪念品
牛牛的旅游纪念品
https://ac.nowcoder.com/acm/contest/5968/E
链接:https://ac.nowcoder.com/acm/contest/5968/E
题目描述
牛牛在牛市的旅游纪念商店里面挑花了眼,于是简单粗暴的牛牛决定——买最受欢迎的就好了。
但是牛牛的背包有限,他只能在商店的n个物品里面带m个回去,不然就装不下了。
并且牛牛希望买到的纪念品不要太相似,所以导购小姐姐帮助牛牛把纪念品全部排成了一行,牛牛只需要让选出来要买的m个物品中任意两个的位置差都大于等于k就行了。
现在告诉你这n个物品排成一行之后的受欢迎程度(可能是负数),求牛牛带回去的m个物品的最大欢迎度之和。
输入描述:
第一行三个数n,m,k
接下来一行,有n个整数,是n个物品按顺序的受欢迎程度。
输出描述:
输出一个数为题目所求的最大和
示例1
输入
4 2 2
2 4 -6 1
输出
5
#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;
int w[10005],dp[105][10005];
int main()
{
int n,m,k,ma=-0x3f;
cin>>n>>m>>k;
memset(dp,-0x3f,sizeof(dp));
for(int i=1;i<=n;i++){
cin>>w[i];
ma=max(ma,w[i]);//记录价值最大的
dp[1][i]=max(dp[1][i-1],w[i]);//前i个价值最大的
}
if(m==1){
cout<<ma;
return 0;
}//如果只带回一个,那么输出价值最大的即可
for(int i=2;i<=m;i++){
for(int j=k+1;j<=n;j++){
dp[i][j]=max(dp[i][j-1],dp[i-1][j-k]+w[j]);
}//因为选择的相邻两个物品的距离至少为k,所以j从k+1枚举即可
}//如果带回大于一个,dp求j个物品带回i个的最大价值
cout<<dp[m][n];
return 0;
}
查看7道真题和解析