Date:2021.12.26
题意:每层有个高度,爬楼梯,正常爬每次只能爬一层。但是用魔法可以一次上一层或者两层,上完魔法处于CD,用完后需要爬一层再恢复,问最少累计爬多少高度才能到顶(魔法算飞不算爬)。
输入格式
第一行一个数n (n<=1000000),表示塔的层数。
第二行n个数(<=100),表示从下往上每层的高度。
思路:一看数据1e6,必须dp。
设f[i][0]:跳过第i层后无灵力,且花费体力的最小值。
f[i][1]:跳过第i层后有灵力,且花费体力的最小值。
状态转移:
①f[i][0] = min( f[i-1][1] , f[i-2][1] );
这一状态一定是因为爬第i、i-1层用了灵力,因此对应爬完第i-1、i-2层后一定有灵力。
②f[i][1] = min( f[i-1][0] , f[i-1][1] ) + a[i];
这一状态一定是因为爬第i层没用灵力,因此对应爬完第i-1层后灵力仍存在 或 爬完第i-1层后灵力不存在,但在爬完第i层后灵力恢复了。
注意:初始状态f[0][0]不存在的,因此注意初始化状态。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10,mod=998244353;
int n,m;

博客介绍了洛谷P2800题目的解法,这是一道关于使用动态规划解决魔法爬塔问题的算法题目。塔有1000000层,每层高度不同,可用魔法一步上一层或两层,但之后需要爬一层恢复魔法。目标是最小化爬到顶层的总高度。通过设置两种状态的动态规划数组,博主给出了状态转移方程和代码实现。
最低0.47元/天 解锁文章
894

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



