1 条题解
-
1
神秘跳台阶游戏
题意
有 n 个台阶,编号为 1, 2, ..., n ,第 i 个台阶高度为 h_i 。
小青一开始站在台阶 1 上,每次可以:
向上跳 1 个台阶;
或向上跳 2 个台阶。
如果从台阶 i 跳到台阶 j ,疲惫值为:|h_i - h_j|
求从台阶 1 跳到台阶 n 的最小总疲惫值。
思路
经典动态规划。 设 dp[i] 表示从第 1 个台阶跳到第 i 个台阶的最小疲惫值。
到达第 i 个台阶有两种方式:- 从第 i - 1 个台阶跳过来;
- 从第 i - 2 个台阶跳过来。
所以转移为:dp[i] = min( dp[i - 1] + |h_i - h_{i - 1}|, dp[i - 2] + |h_i - h_{i - 2}| )
边界:
复杂度
时间复杂度: O(n)
空间复杂度: O(n)
参考代码:
#include<bits/stdc++.h> using namespace std; int n; int h[100005]={0}; int dp[100005]={0}; int cost(int i,int j){ return abs(h[i]-h[j]); } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>h[i]; dp[2]=cost(1,2); for(int i=3;i<=n;i++) dp[i]=min(dp[i-1]+cost(i,i-1),dp[i-2]+cost(i,i-2)); cout<<dp[n]; return 0; }求赞,谢谢!
- 1
信息
- ID
- 2938
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 149
- 已通过
- 31
- 上传者