#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; i++) cin >> nums[i];
// 创建 dp 表
vector<int> dp(n);
// 初始化 dp 表
dp[0] = nums[0];
if(n == 1)
{
cout << dp[0] << endl;
return 0;
}
dp[1] = nums[1];
// 填表
for(int i = 2; i < n; i++)
dp[i] = nums[i] + min(dp[i -1], dp[i - 2]);
// 返回
cout << min(dp[n - 1], dp[n - 2]) << endl;
return 0;
}
// 64 位输出请用 printf("%lld")
dp表分析 : 常用思维, dp[i] 走到第 i 个楼梯需要的最少步数
状态转移方程 : 第 i 个位置可以从 i - 1 或者 i - 2 开始走, 那么就是 dp[i] = min(dp[i -1], dp[i -2]) + nums[i] , 也就是前面的最少加上当前需要走的楼梯
初始化 : 第一个楼梯就是本身楼梯数, 因为你可以直接到第一个楼梯走, 第二个楼梯同理
返回值 : 我们只需要比较 min(dp[n - 1], dp[n - 2]) 即可!

京公网安备 11010502036488号