0
点赞
收藏
分享

微信扫一扫

[动态规划]DP4 最小花费爬楼梯-简单

​​DP4 最小花费爬楼梯​​

描述

给定一个整数数组 [动态规划]DP4 最小花费爬楼梯-简单_动态规划 ,其中 [动态规划]DP4 最小花费爬楼梯-简单_数组_02 是从楼梯第[动态规划]DP4 最小花费爬楼梯-简单_数组_03个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。


数据范围:数组长度满足 [动态规划]DP4 最小花费爬楼梯-简单_动态规划_04 ,数组中的值满足 [动态规划]DP4 最小花费爬楼梯-简单_数组_05

输入描述:

第一行输入一个正整数 n ,表示数组 cost 的长度。

第二行输入 n 个正整数,表示数组 cost 的值。

输出描述:

输出最低花费

示例1

输入:

3
2 5 20

输出:

5

说明:

你将从下标为1的台阶开始,支付5 ,向上爬两个台阶,到达楼梯顶部。总花费为5

示例2

输入:

10
1 100 1 1 1 90 1 1 80 1

输出:

6

说明:

你将从下标为 0 的台阶开始。
1.支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
2.支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
3.支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
4.支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
5.支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
6.支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

题解

使用dp[i]表示到达第i个台阶时的最小花费,则dp[i] = min(dp[i-1] + costs[i-1],dp[i-2] + costs[i-2],表示可以从i-1台阶往上跳1格到达i,或者从i-2跳2格到达i。

代码如下:

#include <bits/stdc++.h>

int solve(std::vector<int> &costs)
{
int n = costs.size();

if (n <= 1)
{
return 0;
}

std::vector<int> dp(n + 1,0);// dp[i]表示从0或者1台阶到达i的时候的最小值
dp[0] = 0;
dp[1] = 0;

for (int i = 2;i <= n;++i)
{
int a = dp[i - 1] + costs[i - 1];
int b = dp[i - 2] + costs[i - 2];
dp[i] = std::min(a,b);
}
return dp.back();
}

int main()
{
int n,x;
std::vector<int> costs;
std::cin >> n;
while (n-- > 0)
{
std::cin >> x;
costs.push_back(x);
}

std::cout << solve(costs) << std::endl;
return 0;
}

举报

相关推荐

0 条评论