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