牛客假日团队赛54 A-分组——dp

针对FarmerJohn希望提升其奶牛包装礼物技能的问题,通过合理的分组策略使每组奶牛技能达到组内最高水平,进而实现整体技能水平之和的最大化。采用动态规划的方法,利用状态转移方程优化分组过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分组
题目描述

在Farmer John最喜欢的节日里,他想要给他的朋友们赠送一些礼物。由于他并不擅长包装礼物,他想要获得他的奶牛们的帮助。你可能能够想到,奶牛们本身也不是很擅长包装礼物,而Farmer John即将得到这一教训。
Farmer John的N头奶牛( 1 ≤ N ≤ 1 0 4 1≤N≤10^4 1N104 )排成一行,方便起见依次编号为1…N。奶牛i的包装礼物的技能水平为si。她们的技能水平可能参差不齐,所以FJ决定把她的奶牛们分成小组。每一组可以包含任意不超过K头的连续的奶牛( 1 ≤ K ≤ 1 0 3 1≤K≤10^3 1K103),并且一头奶牛不能属于多于一个小组。由于奶牛们会互相学习,这一组中每一头奶牛的技能水平会变成这一组中水平最高的奶牛的技能水平。

请帮助FJ求出,在他合理地安排分组的情况下,可以达到的技能水平之和的最大值。

输入描述:

输入的第一行包含N和K。以下N行按照N头奶牛的排列顺序依次给出她们的技能水平。技能水平是一个不超过10^5的正整数。
输出描述:
输出FJ通过将连续的奶牛进行分组可以达到的最大技能水平和。

示例1
输入
7 3
1
15
7
9
2
5
10
输出
84
说明

在这个例子中,最优的方案是将前三头奶牛和后三头奶牛分别分为一组,中间的奶牛单独成为一组(注意一组的奶牛数量可以小于K)。这样能够有效地将7头奶牛的技能水平提高至15、15、15、9、10、10、10,和为84

题解: 状态转移方程:dp[i] = max(dp[i], dp[i - (i - j + 1)] + mmax * (i - j +1))。该方程表示,当前i节点的最大值,一定是往前推j个数,将这一段变为最大数值值,然后再加上前i-(i-j+1)的最优情况。所以枚举j即可。

c++ AC 代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n, m, a[10002], p[10004];
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	for (int i = 1; i <= n; ++i)
	{
		int ma = a[i];
		for (int j = i; i - j < m && j > 0; --j)
		{	// 在间隔为 m 的数中找出最大的那个数来更新当前步的值
			ma = max(ma, a[j]);
			p[i] = max(p[i], p[j - 1] + ma * (i - j + 1));
		}
	}
	printf("%d\n", p[n]);
	//system("pause");
	return 0;
}

文章参考自:https://blog.youkuaiyun.com/Q755100802/article/details/94883681

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值