1. 蓝桥杯"平台跳跃"问题解析
这道来自蓝桥杯算法竞赛的"平台跳跃"问题,是一个典型的动态规划应用场景。题目描述了一个角色在不同高度的平台间跳跃,需要计算从起点到终点的最小能量消耗。这类问题在实际编程竞赛和算法面试中非常常见,掌握其解法对提升算法能力很有帮助。
1.1 问题场景还原
想象你正在玩一个平台跳跃游戏,有n个不同高度的平台排成一条直线。你从第一个平台出发,每次可以选择:
- 跳到相邻的下一个平台(i→i+1)
- 跳过下一个平台直接跳到下下个平台(i→i+2)
不同跳跃方式的能量消耗计算规则不同:
- 单跳(i→i+1):消耗能量为两平台高度差的绝对值
- 双跳(i→i+2):消耗能量为三倍的两平台高度差的绝对值
我们的目标是找到从第1个平台到第n个平台的最小总能量消耗。
1.2 动态规划思路解析
这个问题非常适合用动态规划(DP)来解决,因为:
- 问题可以分解为子问题(到达每个平台的最小消耗)
- 存在最优子结构(当前最优解依赖于前面子问题的最优解)
- 有重叠子问题(计算dp[i]时会重复用到dp[i-1]和dp[i-2])
DP的核心思想是:记录到达每个状态的最优解,避免重复计算。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法实现详解
2.1 数据结构设计
首先我们需要合理的数据结构来存储和处理数据:
cpp复制vector<ll> h(n+1); // 平台高度数组,h[1]到h[n]有效
vector<ll> dp(n+1); // DP状态数组,dp[i]表示到达第i个平台的最小能量
这里使用vector而不是普通数组,因为:
- 可以动态确定大小
- 自动管理内存
- 提供边界检查(调试时有用)
使用long long(ll)类型是为了防止大数计算时的溢出问题。
2.2 状态转移方程
这是整个算法的核心部分:
cpp复制dp[i] = min(dp[i-1] + abs(h[i]-h[i-1]), // 从i-1跳过来
dp[i-2] + 3*abs(h[i]-h[i-2])); // 从i-2跳过来
解释:
- 到达平台i的最小能量有两种可能:
- 从i-1平台单跳过来:总能量=到达i-1的能量 + 本次跳跃消耗
- 从
