牛客算法入门课练习赛2 : 牛牛的旅游纪念品
发布日期:2021-05-07 07:56:16 浏览次数:29 分类:原创文章

本文共 741 字,大约阅读时间需要 2 分钟。

牛牛的旅游纪念品

题解:这个题如果没有对位置的限制,就可以贪心取前m大的数即可。
但本题的关键在于买的m个物品中任意两个的位置差都大于等于k。那么贪心的方法显而易见行不通,很容易联想到用动态规划取搞。那么它的状态如何表示?状态转移方程怎么写?
由题可知本题有两个状态,n个物品以及取走m个物品,并且对物品的位置有着限制,那么我们可以定义
dp[i][j]:前j个物品取i个的欢迎程度
dp[i][j]无非由两种状态转移而来

  1. 没有买第j个物品,那么dp[i][j]=dp[i][j-1]。
  2. 买了第j个物品,那么此时dp[i][j]=dp[i-1][j-k]+a[j]。

很容易得到状态转移 方程:dp[i][j]=max(dp[i][j-1],dp[i-1][j-k]+a[j])。
初始状态就是在取第一个时,dp[1][j]=max(dp[1][j-1],a[j])。

int a[maxn];int dp[maxm][maxn];int main(){   	int n,m,k;	cin >> n >> m >> k;	for(int i=1;i<=n;i++) cin >> a[i];	for(int i=0;i<maxm;i++)		for(int j=0;j<maxn;j++) dp[i][j]=-inf;	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;}
上一篇:[2020年牛客算法入门课练习赛2] 古老的牛市,遗迹的天梯
下一篇:Codeforces Round 89 (Rated for Div. 2)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月02日 23时03分07秒