洛谷P2800 又上锁妖塔【DP】【橙】

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

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值