【动态规划 贪心】JZOJ_4249 游戏

本文探讨了一种基于贪心策略解决的最大价值路径问题。在一个从起点到终点的路径上,通过选择每一步都能获得最大价值的跳跃点,实现整体路径价值最大化。文章详细解析了贪心策略的有效性,并提供了C++实现代码。

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

题意

一个人从起点000出发。
他现在如果在iii,那么如果跳到jjj,那么获得的价值为(j−i)∗aj(j-i)*a_j(ji)aj
求刚好落到终点nnn的最大可获得的价值。

思路

刚开始看到就想到O(n2)的dpO(n^2)的dpO(n2)dp,结果看了下数据发现只能拿606060分,正解是斜率优化(当然我这么菜怎么可能打 )。
可以用贪心,我们每次从iii跳都直接跳到后面最大的aja_jaj
证明:
设后面最大的aaaaja_jaj,在起点和jjj中有一个iii
那么从起点xxx出发到iii再到jjj的价值就是ai∗(i−x)+aj∗(j−i)a_i*(i-x)+a_j*(j-i)ai(ix)+aj(ji)
从起点xxx直接到jjj的价值就是aj∗(j−x)a_j*(j-x)aj(jx)
显然第二个优于第一个。

代码

#include<cstdio>
#include<algorithm>

int n, ans;
int a[100001], maxa[100001];

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	for (int i = n; i >= 1; i--)
		maxa[i] = std::max(maxa[i + 1], a[i]);
	int next = 0;
	for (int i = 1; i <= n; i++)
		if (a[i] == maxa[next + 1]) {
			ans += a[i] * (i - next);
			next = i;
		}
	printf("%d", ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值