列表

详情


NC207751. 牛牛的旅游纪念品

描述

牛牛在牛市的旅游纪念商店里面挑花了眼,于是简单粗暴的牛牛决定——买最受欢迎的就好了。
但是牛牛的背包有限,他只能在商店的n个物品里面带m个回去,不然就装不下了。
并且牛牛希望买到的纪念品不要太相似,所以导购小姐姐帮助牛牛把纪念品全部排成了一行,牛牛只需要让选出来要买的m个物品中任意两个的位置差都大于等于k就行了。
现在告诉你这n个物品排成一行之后的受欢迎程度(可能是负数),求牛牛带回去的m个物品的最大欢迎度之和。

输入描述

 第一行三个数n,m,k

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

输出描述

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

示例1

输入:

4 2 2
2 4 -6 1

输出:

5

说明:

n\leq10000,m\leq100,m\leq n,答案保证在int范围内,保证按照题目要求一定能取到m个物品

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 40ms, 内存消耗: 41560K, 提交时间: 2023-05-14 21:37:27

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,k,a[N],dp[105][N];
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	memset(dp,-0x3f,sizeof(dp));
	for(int i=1;i<=n;i++) dp[1][i]=max(dp[1][i-1],a[i]);
	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]+a[j]);
	cout<<dp[m][n]<<endl;
}

C++(clang++ 11.0.1) 解法, 执行用时: 10ms, 内存消耗: 4812K, 提交时间: 2023-05-11 00:00:42

#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[10010],dp[110][10010];
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)  cin>>a[i];
	memset(dp,-0x3f,sizeof(dp));
	for(int i=1;i<=n;i++)  dp[1][i]=max(dp[1][i-1],a[i]);
	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]+a[j]);
	cout<<dp[m][n];
}

上一题