算法练习 DAY38 || 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

509. 斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。

示例 1:

输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

0 <= n <= 30
class Solution {
public:
	int fib(int n) {
		if (n < 2) {
			return n;
		}
		vector<int> dp;
		dp.push_back(0);
		dp.push_back(1);
		for (int i = 2; i <= n; i++) {
			dp.push_back(dp[i - 1] + dp[i - 2]);
		}
		return dp.back();
	}
};

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
    1 阶 + 1 阶
    2 阶

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
    1 阶 + 1 阶 + 1 阶
    1 阶 + 2 阶
    2 阶 + 1 阶

思路:
动规五部曲:

定义一个一维数组来记录不同楼层的状态

确定dp数组以及下标的含义

dp[i]: 爬到第i层楼梯,有dp[i]种方法

确定递推公式

如果可以推出dp[i]呢?

从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。
还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。
那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!
所以dp[i] = dp[i - 1] + dp[i - 2] 。

746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

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

请你计算并返回达到楼梯顶部的最低花费。
在这里插入图片描述

/*
自己写的(AC成功)

dp[i]  是到达第i阶楼梯时,支付过的费用(包括之前的费用和当前这个台阶要支付的费用)
dp[i] 这一阶可以是爬一层或者爬两层上来的 选最小的那个
dp[i] = min(dp[i-2],dp[i-1]) + cost[i]
*/
class Solution {
public:
	int minCostClimbingStairs(vector<int>& cost) {
		vector<int> dp(cost.size() + 1, 0);
		//已知   2 <= cost.length <= 1000  那么顶层起码就是3  
		dp[0] = cost[0];
		dp[1] = cost[1];
		
		for (int i = 2; i < cost.size(); i++) {
			dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
		}
		return min(dp[dp.size() - 1], dp[dp.size() - 2]) ;
	}
};


/*
	dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]
	可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。

	dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。

	dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。

	那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?

	一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
*/
class Solution {
public:
	int minCostClimbingStairs(vector<int>& cost) {
		vector<int> dp(cost.size()+1);
		dp[0] = 0;
		dp[1] = 0;
		//题目说的很清楚  起点是0 或 1   所以花费就是0
		for (int i = 2; i <= cost.size(); i++) {
			dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
		}
		return dp[cost.size()];
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值