牛客算法入门课练习赛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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44235989/article/details/106771151
今日推荐