当前位置: 首页 > news >正文

D33|动态规划!启程!

1.动态规划五部曲:

        1)确定dp数组(dp table)以及下标的含义

        2)确定递推公式

        3)dp数组如何初始化

        4)确定遍历顺序

        5)举例推导dp数组

2.动态规划应该如何debug

        找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!


509.斐波那契数

初始思路:

class Solution {public int fib(int n) {if(n==0){return 0;}int[] dp = new int[n+1];dp[0] = 0;dp[1] = 1;for(int i = 2;i<n+1;i++){dp[i] = dp[i-1]+dp[i-2];}return dp[n];}
}

题解复盘:

题解更加清晰,首先按照动态规划五部曲进行分析:

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

        dp[i]的定义为:第i个数的斐波那契数值是dp[i]

2)确定递推公式

        状态转移方程 dp[i] = dp[i - 1] + dp[i - 2]

3)dp数组如何初始化

dp[0] = 0;
dp[1] = 1;

4)确定遍历顺序

 从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的。

5)举例推导dp数组

0 1 1 2 3 5 8 13 21 34 55

压缩空间版本的题解:

class Solution {public int fib(int n) {if (n < 2) return n;int a = 0, b = 1, c = 0;for (int i = 1; i < n; i++) {c = a + b;a = b;b = c;}return c;}
}

70.爬楼梯

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

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

初始思路:

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

        dp[i]的定义为:表示爬到第i个台阶不同方法的数量。

2)确定递推公式:

        dp[i] = dp[i - 1] + dp[i - 2]

3)dp数组如何初始化

dp[1] = 1;爬一层台阶只有一种方法

dp[2] = 2;爬两层台阶可以一次爬两层也可以爬两个一层。

4)确定遍历顺序

 从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的。

5)举例推导dp数组

1,2,3,5,8,13,21,34

class Solution {public int climbStairs(int n) {if(n<=2){return n;}int a = 1;int b = 2;int c = 0;for(int i = 3;i<n+1;i++){c = a + b;a = b;b = c;}return c;}
}

746. 使用最小花费爬楼梯 

初始思路:

这道题目就是在不同的爬楼梯方案中,挑选出来最小花费的爬楼梯方案。

唯一需要斟酌的地方就是我究竟是让其从第0阶台阶开始攀爬,还是从第1阶台阶开始攀爬。

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

       dp[i]的定义为:表示爬到第i个台阶所需要的最小花费。

2)确定递推公式:

        dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

3) dp数组如何初始化

        dp[0] = 0;dp[1] = 0;dp[2] = min(dp[0]+cost[0],cost[1]+dp[1]);

4) 确定遍历顺序

        由前到后

5)举例推导dp数组

0,0,10,15

class Solution {public int minCostClimbingStairs(int[] cost) {int[] dp = new int[cost.length+1];dp[0] = 0;dp[1] = 0;for(int i = 2;i<=cost.length;i++){dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[cost.length];}
}

题解复盘:

基本一致

        

http://www.lryc.cn/news/261258.html

相关文章:

  • C语言----文件操作(二)
  • oracle 10046事件跟踪
  • 微软自带浏览器Edge,无法关闭“保存历史记录网站的屏幕截图”解决方案
  • 讲座 | 颠覆传统摄像方式乃至计算机视觉的“脉冲视觉”
  • uniGUI学习之UniHTMLMemo1富文本编辑器
  • 详细教程 - 从零开发 鸿蒙harmonyOS应用 第四节 (鸿蒙Stage模型 登录页面 ArkTS版 推荐使用)
  • uniapp怎么实现授权登录
  • 从零开始:前端架构师的基础建设和架构设计之路
  • 椋鸟C语言笔记#26:数据在内存中的存储(大小端字节序)、浮点数的存储(IEEE754)
  • 设计模式——组合模式(结构型)
  • 鸿蒙小车之多任务调度实验
  • 【报错栏】(vue)Module not found: Error: Can‘t resolve ‘element-ui‘ in xxx
  • seaborn库图形进行数据分析(基于tips数据集)
  • AC843. n皇后问题--60
  • Js WebSocket类,收发Json,带心跳,断线重连
  • VBA技术资料MF96:单字段多条件高级筛选
  • 电子取证中Chrome各版本解密Cookies、LoginData账号密码、历史记录
  • Axure元件基本介绍进阶
  • 安卓11添加切换以太网动态静态方法
  • 初级数据结构(五)——树和二叉树的概念
  • pdf读取内容缺失(漏字/文字丢失)问题
  • c#面试基础语法——现有⼀个整数number,请写⼀个⽅法判断这个整数是否是2的N次⽅
  • 27系列DGUS智能屏发布:可实时播放高清模拟信号摄像头视频
  • YOLOv8改进 | 2023主干篇 | 替换LSKNet遥感目标检测主干 (附代码+修改教程+结构讲解)
  • 【工具】VUE 前端列表拖拽功能代码
  • 人工智能与量子计算:开启未知领域的智慧之旅
  • 2023了,前端实现AI电子秤思路分析
  • CSS学习
  • Flask基本用法:一个HelloWorld,搭建服务、发起请求
  • Tomcat-安装部署(源码包安装)