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;
int f[300005];
int main()
{
int m,s,t;
cin>>m>>s>>t;
for(int i=1;i<=t;i++)
{
if(m>=10)
{
f[i]=f[i-1]+60;
m-=10;
}
else
{
f[i]=f[i-1];
m

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

被折叠的 条评论
为什么被折叠?



