动态规划(Dynamic Programming)例题步骤详解

旧城等待, 2022-11-30 01:36 178阅读 0赞

文章目录

  • 动态规划(Dynamic Programming)浅学 - 学习笔记
    • 题目特点:
    • 1、选择硬币组合问题:(Coin Change)
    • 动态规划题四个核心步骤:
      • 一、确定状态
      • 二、转移方程
      • 三、初始条件和边界情况
      • 四、计算顺序
      • 小结:
      • 编程代码:(Java)
    • 2、多少种路径问题(Unique Paths)
      • 1、确定状态
      • 2、转移方程
      • 3、初始条件和边界情况
      • 4、计算顺序
      • 编程代码:(Java)
    • 3、Jump Game
      • 1、确定状态
      • 2、转移方程
      • 3、初始条件和边界情况
      • 4、计算顺序
      • 编程代码:(Java)
      • 总结

动态规划(Dynamic Programming)浅学 - 学习笔记

题目特点:

在这里插入图片描述

1、选择硬币组合问题:(Coin Change)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

动态规划题四个核心步骤:

一、确定状态

在这里插入图片描述

其中,最后一步是指:(上面例子举例说)

在这里插入图片描述

在这里插入图片描述

其中,子问题是指:(上面例子举例说)

在这里插入图片描述

在这里插入图片描述

递归解法:

在这里插入图片描述

递归解法的问题:

在这里插入图片描述

重复计算,效率不高!

应当如何避免?

将计算结果保存下来(memories),并改变计算顺序。

二、转移方程

在这里插入图片描述

三、初始条件和边界情况

在这里插入图片描述

四、计算顺序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

小结:

在这里插入图片描述

编程代码:(Java)

  1. public class Solution{
  2. //{2,5,7} 27
  3. public int coinChange(int A[],int M){
  4. int[] f = new int[M+1]; //0...M
  5. int len = A.length;
  6. //初始化
  7. f[0] = 0;
  8. int i,j;
  9. for(i=1;i<=M;++i){
  10. f[1] = Integer.MAX_VALUE;
  11. //f[i] = min{f[i-A[0]]+1,...,f[i-A[len-1]]+1}
  12. for(j=0;j<len;++j){
  13. if(i>=A[j] && f[i-A[j]] != Integer.MAX_VALUE){ //判断条件
  14. f[i] = Math.min(f[i-A[j]]+1,f[i]);
  15. }
  16. }
  17. }
  18. if(f[M] == Math.MAX_VALUE){
  19. f[M] = -1;
  20. }
  21. return f[M];
  22. }
  23. }

2、多少种路径问题(Unique Paths)

在这里插入图片描述

1、确定状态

在这里插入图片描述

子问题:

在这里插入图片描述

2、转移方程

在这里插入图片描述

3、初始条件和边界情况

在这里插入图片描述

4、计算顺序

在这里插入图片描述

编程代码:(Java)

  1. public class Solution{
  2. public int uniquePaths(int m,int n){
  3. int[][] f = new int[m][n];
  4. int i,j;
  5. for(i=0;i<m;++i){ //行 从上到下
  6. for(j=0;j<n;++j){ //列 从左到右
  7. if(i=0 && j=0){
  8. f[i][j] = 1;
  9. }else{
  10. f[i][j] = f[i-1][j]+f[i][j-1];
  11. }
  12. }
  13. }
  14. return f[m-1][n-1];
  15. }
  16. }

3、Jump Game

在这里插入图片描述

1、确定状态

在这里插入图片描述

子问题:

在这里插入图片描述

2、转移方程

在这里插入图片描述

3、初始条件和边界情况

在这里插入图片描述

4、计算顺序

在这里插入图片描述

编程代码:(Java)

  1. public class Solution{
  2. public boolean canJump(int[] A){
  3. int n = A.length;
  4. boolean[] f = new boolean[n];
  5. //初始化
  6. f[0] = true;
  7. int i,j;
  8. for(j = 1;j < n;j++){
  9. f[j] = false;
  10. for(i=0;i<j;i++){
  11. if(f[i] && i+A[i] >= j){
  12. f[j] = true;
  13. break;
  14. }
  15. }
  16. }
  17. return f[n-1];
  18. }
  19. }

此题若用贪心算法时间复杂度则为O(n):

贪心算法解题思路

这个问题可以通过递归很容易解决来处理,我们想要知道能否到达index,那么只需要知道index之前的元素是不是有nums[i]+i >= index for i in range(index)(也就是index之前是不是有位置可以到达index)。

  1. public class Solution {
  2. public boolean canJump(int[] nums) {
  3. int reach = nums[0];
  4. for(int i = 1; i < nums.length && reach >= i; i++)
  5. if(i + nums[i] > reach) reach = i + nums[i]; //贪心策略
  6. return reach >= (nums.length-1) ? true : false;
  7. }
  8. }

总结

在这里插入图片描述

此博文是在网上看了一个关于动态规划的学习视频所记录,如有问题还请指出,感谢。

发表评论

表情:
评论列表 (有 0 条评论,178人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态规划Dynamic Programming

    首先以LeetCode上面的一个问题来开始动态规划的讲解: 题目描述:你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的

    相关 算法-动态规划 Dynamic Programming

    今天在leetcode刷题的时候,遇到动态规划类型的题目,想更加深入的了解下,就从网上搜了搜,发现博主的这篇文章讲解的很详细,因此分享下,希望给大家都带来帮助。 转载自:[h