算法学习day38动态规划part01-509、70、746

发布时间 2023-06-01 23:33:39作者: 坤坤无敌
package LeetCode.DPpart01;
/**
 * 509. 斐波那契数
 * 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。
 * 该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
 * F(0) = 0,F(1) = 1
 * F(n) = F(n - 1) + F(n - 2),其中 n > 1
 * 给定 n ,请计算 F(n) 。
 * 示例:
 * 输入:n = 2
 * 输出:1
 * 解释:F(2) = F(1) + F(0) = 1 + 0 = 1
 * */

public class FibonacciNumber_509 {
    public static void main(String[] args) {
        int num = 2;
        int result = fib(num);
        System.out.println(result);
    }
    public static int fib(int n) {
        if (n <= 1) return n;
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        for (int index = 2; index <= n; index++){
            dp[index] = dp[index - 1] + dp[index - 2];
        }
        return dp[n];
    }

}
package LeetCode.DPpart01;
/**
* 70. 爬楼梯
* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
* 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
* 示例:
* 输入:n = 2
* 输出:2
* 解释:有两种方法可以爬到楼顶。
* 1. 1 阶 + 1 阶
* 2. 2 阶
* */

public class ClimbingStairs_70 {
    public static void main(String[] args) {
        int num = 2;
        int result = climbStairs(num);
        System.out.println(result);
    }
    //常规版本
    public static int climbStairs(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
    // 用变量记录代替数组
    // 空间优化
    public static int climbStairs2(int n) {
        if(n <= 2) return n;
        int a = 1, b = 2, sum = 0;

        for(int i = 3; i <= n; i++){
            sum = a + b;  // f(i - 1) + f(i - 2)
            a = b;        // 记录f(i - 1),即下一轮的f(i - 2)
            b = sum;      // 记录f(i),即下一轮的f(i - 1)
        }
        return b;
    }

}
package LeetCode.DPpart01;
/**
 * 746. 使用最小花费爬楼梯
 * 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
 * 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
 * 请你计算并返回达到楼梯顶部的最低花费。
 * 示例:
 * 输入:cost = [10,15,20]
 * 输出:15
 * 解释:你将从下标为 1 的台阶开始。
 * - 支付 15 ,向上爬两个台阶,到达楼梯顶部。
 * 总花费为 15 。
 * */
public class MinCostClimbingStairs_746 {
    public static void main(String[] args) {
        int [] cost = {10,15,20};
        int result = minCostClimbingStairs(cost);
        System.out.println(result);

    }

    public static int minCostClimbingStairs(int[] cost) {
        int len = cost.length;
        int[] dp = new int[len + 1];

        // 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0
        dp[0] = 0;
        dp[1] = 0;

        // 计算到达每一层台阶的最小费用
        for (int i = 2; i <= len; i++) {
            dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }

        return dp[len];
    }
}