• LeetCode——动态规划篇(一)


    刷题顺序及思路来源于代码随想录,网站地址https://programmercarl.com 

    目录

    509. 斐波那契数 - 力扣(LeetCode)

    70. 爬楼梯 - 力扣(LeetCode)

    746. 使用最小花费爬楼梯 - 力扣(LeetCode)

    62. 不同路径 - 力扣(LeetCode)

     63. 不同路径 II - 力扣(LeetCode)




    509. 斐波那契数 - 力扣(LeetCode)

    斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

    F(0) = 0,F(1) = 1
    F(n) = F(n - 1) + F(n - 2),其中 n > 1
    

    给定 n ,请计算 F(n) 。

    1. 输入:n = 2
    2. 输出:1
    3. 解释:F(2) = F(1) + F(0) = 1 + 0 = 1
    1. package com.light.code.leetcode.dp;
    2. import java.util.Scanner;
    3. /**
    4. * @author light
    5. * @Description 斐波那契数列
    6. * F(0) = 0,F(1) = 1
    7. * F(n) = F(n - 1) + F(n - 2),其中 n > 1,给定 n ,请计算 F(n) 。
    8. * @create 2023-09-13 9:28
    9. */
    10. public class FibTest {
    11. public static void main(String[] args) {
    12. Scanner input=new Scanner(System.in);
    13. int n=input.nextInt();
    14. System.out.println(fib(n));
    15. }
    16. public int fib(int n) { //动态规划解法
    17. if(n<=1){
    18. return n;
    19. }
    20. int dp[]=new int[n+1]; //1、确定dp数组含义:第i个数的斐波那契数值为df[i]
    21. dp[0]=0; //3、初始化递推公式
    22. dp[1]=1;
    23. for(int i=2;i<=n;i++){ //4、遍历顺序
    24. dp[i]=dp[i-1]+dp[i-2]; //2、确定递推公式
    25. }
    26. return dp[n];
    27. //5、如果有问题打印dp数组
    28. }
    29. }

    70. 爬楼梯 - 力扣(LeetCode)

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

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

    1. 输入:n = 2
    2. 输出:2
    3. 解释:有两种方法可以爬到楼顶。
    4. 1. 1 阶 + 1
    5. 2. 2
    1. import java.util.Scanner;
    2. /**
    3. * @author light
    4. * @Description 爬楼梯
    5. *
    6. * @create 2023-09-13 9:36
    7. */
    8. public class ClimbStairsTest {
    9. public static void main(String[] args) {
    10. Scanner input=new Scanner(System.in);
    11. int n=input.nextInt();
    12. System.out.println(climbStairs(n));
    13. }
    14. public int climbStairs(int n) {
    15. if(n<=2){
    16. return n;
    17. }
    18. //确定dp数组及下标含义 dp[i]:爬到第i阶楼梯有dp[i]种方法
    19. int[] dp=new int[n+1];
    20. //确定递推公式--->dp[i]=dp[i-2]+dp[i-1]
    21. //初始化dp数组
    22. dp[1]=1;
    23. dp[2]=2;
    24. for(int i=3;i<=n;i++){
    25. dp[i]=dp[i-1]+dp[i-2];
    26. }
    27. return dp[n];
    28. }
    29. }

    746. 使用最小花费爬楼梯 - 力扣(LeetCode)

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

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

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

    1. 输入:cost = [10,15,20]
    2. 输出:15
    3. 解释:你将从下标为 1 的台阶开始。
    4. - 支付 15 ,向上爬两个台阶,到达楼梯顶部。
    5. 总花费为 15
    1. import java.util.Scanner;
    2. /**
    3. * @author light
    4. * @Description 最小花费爬楼梯
    5. *
    6. * @create 2023-09-13 10:02
    7. */
    8. public class MinCostClimbingStairsTest {
    9. public static void main(String[] args) {
    10. Scanner input=new Scanner(System.in);
    11. int n=input.nextInt();
    12. int[] num=new int[n];
    13. for (int i = 0; i < n; i++) {
    14. num[i]=input.nextInt();
    15. }
    16. System.out.println(minCostClimbingStairs(num));
    17. }
    18. public int minCostClimbingStairs(int[] cost) {
    19. //1 定义dp数组并确认其含义dp[i] 爬到第i阶台阶的最低花费
    20. int[] dp=new int[cost.length+1];
    21. //3 初始化dp数组
    22. dp[0]=0;
    23. dp[1]=0;
    24. //4 确认遍历顺序
    25. for(int i=2;i<=cost.length;i++){
    26. //2 确认转移矩阵
    27. dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
    28. }
    29. return dp[cost.length];
    30. }
    31. }

    62. 不同路径 - 力扣(LeetCode)

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

    问总共有多少条不同的路径?

    1. import java.util.Scanner;
    2. /**
    3. * @author light
    4. * @Description 不同路径
    5. * 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
    6. *
    7. * 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
    8. *
    9. * 问总共有多少条不同的路径?
    10. *
    11. * @create 2023-09-13 10:33
    12. */
    13. public class UniquePathsTest {
    14. public static void main(String[] args) {
    15. Scanner input=new Scanner(System.in);
    16. int m=input.nextInt();
    17. int n=input.nextInt();
    18. System.out.println(uniquePaths(m, n));
    19. }
    20. public int uniquePaths(int m, int n) {
    21. //确定dp数组及其含义 do[i][j]:到位置为(i,j)的格子有几条路径
    22. int[][] dp=new int[m][n];
    23. //初始化dp数组
    24. for(int i=0;i
    25. dp[i][0]=1;//列
    26. }
    27. for(int j=0;j
    28. dp[0][j]=1; //行
    29. }
    30. //确认遍历顺序
    31. for(int i=1;i
    32. for(int j=1;j
    33. //确定转移矩阵
    34. dp[i][j]=dp[i-1][j]+dp[i][j-1];
    35. }
    36. }
    37. return dp[m-1][n-1];
    38. }
    39. }

     63. 不同路径 II - 力扣(LeetCode)

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

    现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

    网格中的障碍物和空位置分别用 1 和 0 来表示。

    1. class Solution {
    2. public int uniquePathsWithObstacles(int[][] obstacleGrid) {
    3. int m=obstacleGrid.length;
    4. int n=obstacleGrid[0].length;
    5. //确定dp数组及其含义
    6. // dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
    7. int[][] dp=new int[m][n];
    8. //如果在起点或终点出现了障碍,直接返回0
    9. if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1){
    10. return 0;
    11. }
    12. //初始化dp数组
    13. for(int i=0;i0][i]==0;i++){
    14. dp[0][i]=1;
    15. }
    16. for(int i=0;i0]==0;i++){
    17. dp[i][0]=1;
    18. }
    19. //遍历顺序
    20. for(int i=1;i
    21. for(int j=1;j
    22. //确定状态转移方程
    23. if(obstacleGrid[i][j]==0){
    24. dp[i][j]=dp[i-1][j]+dp[i][j-1];
    25. }
    26. }
    27. }
    28. return dp[m-1][n-1];
    29. }
    30. }

     

     

  • 相关阅读:
    【k8s】1、基础概念和架构及组件
    你真的懂ArrayList吗?
    Scala基础教程--13--函数进阶
    SQL注入漏洞(绕过篇)
    verilog--用于电路设计--0
    网络编程:使用UDP协议实现服务器与客户端的交互
    K8S的安全机制
    450-500未传计算机毕业设计安卓App毕设项目之ssm公园植物介绍APP
    开发必备Liunx常用的几个命令
    [算法日志]图论: 深度优先搜索(DFS)
  • 原文地址:https://blog.csdn.net/zssxcj/article/details/132845442