[蓝桥杯python] 秘密行动
问题描述
小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面。这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层,但是这项能力无法连续使用。已知向上1高度消耗的时间为1,跳跃不消耗时间。由于事态紧急,小D想知道他最少需要多少时间到达顶层。
1、资源限制
资源限制
时间限制:1.0s 内存限制:256.0MB
2、输入格式
第一行包含一个整数n,代表楼的高度。
接下来n行每行一个整数ai,代表i层的楼层高度(ai <= 100)。
3、输出格式
输出1行,包含一个整数,表示所需的最短时间。
4、样式输入及输出
样例输入
5
3
5
1
8
4
样例输出
1
5、代码及解析
具体解析请大家自己看一下代码中的备注,在此不多做解释。
注意:可能有些人题都没读懂,但是这道题的意思是,特殊技能用一次,用了之后要爬一层楼后才能接着用技能,例程就是先用一次二级跳然后爬第三层时间为1,然后在用一次技能就能到顶楼。
n = int(input())
nums = [int(input()) for _ in range(n)]
#创建一个n+1*2的矩阵
#dp[i][j]表示第i层是选择爬还是跳跃
#dp[i][0]代表爬,[1]代表跳
dp = [[0 for _ in range(2)] for _ in range(n+1)]
#初始化起点处,不管爬和跳时间都为0
dp[0][0],dp[0][1] = 0,0
for i in range(1,n+1):
#爬的时间在于前两层跳的时间最小的加上该层数层高
#因为选择了就代表着之前跳了,该层不能跳了
dp[i][0] = min(dp[i-1][0]+nums[i-1],dp[i-1][1]+nums[i-1])
#选择跳则与前两层爬有关,代表着前两层每跳,这一层可以跳了
dp[i][1] = min(dp[i-1][0],dp[i-2][0])
print(dp[-1][-1])
结果:
自己写的所以有点复杂,但是至少能完成嘿嘿。如果各位有优化欢迎评论区讨论!!