一题多解之守望者逃离

本文探讨了P1095 [NOIP2007 普及组] 守望者的逃离问题的解法,包括二维DP和贪心策略。在分析题目后,提出一个贪心思路:魔法值足够时优先使用闪避。二维DP状态转移方程考虑了不同魔法值下的最大逃跑距离,而一维DP侧重于在每秒能通过的最大距离。贪心做法则注重代码实现中的细节策略。

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

P1095 [NOIP2007 普及组] 守望者的逃离

此题有较为多种解法:DP,贪心,数学解法

本文章只介绍其中的两种DP做法和贪心做法

分析:

阅读题目,有一个小贪心:就是魔法值足够的时候能闪则闪。

于是乎,不管是哪一种方法,首先都要算闪,就是闪光为止。

解法一:二维DP

设计这样一个状态:f[i][j]表示i秒后,拥有j点魔法值,可以跑出的最大距离。

当我们把闪的处理好以后,剩下的魔法值不能闪了,最多也就是9,再加上原地回蓝+4,一共是13,这就意味着f[i][j]的j不用太大,15即可。

//状态转移方程并非难事
f[i][j]=max(f[i-1][j]+17,f[i][j]);

if(j>=4)
  f[i][j]=max(f[i-1][j-4],f[i][j]);
if(j<4)
  f[i][j]=max(f[i-1][j+10]+60,f[i][j]);

解法二:一维DP

用f[i]表示,第i秒能通过的最大距离

一共只有三种走法:原地回蓝,闪60米,跑17米。先处理前两种,遵循能闪就闪的原则

代码非常好懂

#include <bits/stdc++.h>
using namespace std
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值