代码随想录算法训练营第四十五天 _ 动态规划_ 70. 爬楼梯、322.零钱兑换、279.完全平方数、139.单词拆分。

学习目标:

动态规划五部曲:
① 确定dp[i]的含义
② 求递推公式
③ dp数组如何初始化
④ 确定遍历顺序
⑤ 打印递归数组 ---- 调试
引用自代码随想录!

60天训练营打卡计划!

学习内容:

70. 爬楼梯

  • 动态规划五步曲:
    ① 确定dp[j]的含义 : 容量为j的背包可以放dp[j]种排列
    ② 求递推公式 : dp[j] += dp[j-i]; (排列问题的标准递推公式!)
    ③ dp数组如何初始化 : dp[0] = 1
    ④ 确定遍历顺序 : 排列问题!先遍历背包,再遍历物品!
class Solution {// 使用完全背包再做!// 是一种排列问题!// 先遍历背包,再遍历物品!public int climbStairs(int n) {// dp数组的含义是:容量为j的背包可以放dp[j]种排列int[] dp = new int[n + 1];// 初始化dp[0] = 1;// 递归逻辑for(int j = 1; j <= n; j++){for(int i = 1; i <= 2 && j >= i; i++){dp[j] += dp[j-i];}}return dp[n];}
}

322.零钱兑换

  • 动态规划五步曲:
    ① 确定dp[j]的含义 : 装满容量为i的背包,最少的物品数量dp[j]
    ② 求递推公式 : dp[j] = min(dp[j-coins[i]]+1, dp[j])
    ③ dp数组如何初始化 : dp[0] = 0 其他的都是Integer.MAX_VALUE
    ④ 确定遍历顺序 : 都可以,因为不管是排列还是组合,元素的个数是一样的。

  • 因为初始值是Integer.MAX_VALUE,再做加法就会溢出,一定会成为最小值。所以在递归的最小逻辑上要额外的判断,如果(dp[j - coins[i]]是最大值,说明该位没有意义,没有被选择的意义。

class Solution {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount+1];int itemSize = coins.length;// 初始化dp[0] = 0;for(int i = 1; i <= amount; i++){dp[i] = Integer.MAX_VALUE;// System.out.println(dp[i] + " ");}// System.out.println("*");// 递归逻辑for(int i = 0; i < itemSize; i++){for(int j = coins[i]; j <= amount; j++){//只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要if (dp[j - coins[i]] != Integer.MAX_VALUE) {//选择硬币数目最小的情况dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}// System.out.println(dp[j] + " ");}// System.out.println("*");}return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];}
}

279.完全平方数

  • 动态规划五步曲:
    ① 确定dp[j]的含义 : 凑成 i 这个数需要的最少的完全平方数的个数dp[j]。
    ② 求递推公式 : dp[j] = min(dp[j] , dp[j-i*i]+1)
    ③ dp数组如何初始化 : dp[0] = 0 其他的都是Integer.MAX_VALUE
    ④ 确定遍历顺序 : 都可以,因为不管是排列还是组合,元素的个数是一样的。

  • 本题的特殊之处在于物品遍历时的结束条件:i*i <= n ,太精髓了!

class Solution {public int numSquares(int n) {int[] dp = new int[n+1];// 初始化for(int j =0; j <= n; j++){dp[j] = Integer.MAX_VALUE;}dp[0] = 0;// 递归逻辑,需要考虑终止的条件i*i <= n// 如果取i < n/2的话,1和2无法进入循环for(int i = 1; i*i <= n; i++){for(int j = i*i; j <= n; j++){if(dp[j - i*i] != Integer.MAX_VALUE){dp[j] = Math.min(dp[j], dp[j - i*i]+1);}}}return dp[n];}}

139.单词拆分

  • 动态规划五步曲:
    ① 确定dp[i]的含义 : 当前 i 长度的字符串可以被字典中共计dp[i]个单词组成。
    ② 求递推公式 :
// 只有当dp[j]可以被wordDict组成的时候,才有必要去继续比较if(dp[j] != -1 && set.contains(sub)){dp[i] = dp[j] + 1;}

③ dp数组如何初始化 : dp[0] = 0 dp[其他] = -1
④ 确定遍历顺序 :先遍历背包,再遍历物品,因为本题是一种排列。
背包指的肯定是字符串s,背包里装的是截至i长度的字符串可以被字典中的几个单词组成;物品指的是字典中的单词。

// 使用上述的动态规划思想完成的代码,可以更好地被视为完全背包问题。
class Solution {public boolean wordBreak(String s, List<String> wordDict) {HashSet<String> set = new HashSet<>();for(int i = 0; i < wordDict.size(); i++){set.add(wordDict.get(i));}// 指的是截至i长度的字符串被几个单词组成int[] dp = new int[s.length() + 1];// 初始化dp[0] = 0;for(int i = 1; i <= s.length(); i++){dp[i] = -1;}// 递推逻辑  - 算是一种排列,所以先背包后物品for(int i = 0; i <= s.length(); i++){for(int j = 0; j < i; j++){// 左闭右开String sub = s.substring(j, i);// 只有当dp[j]可以被wordDict组成的时候,才有必要去继续比较if(dp[j] != -1 && set.contains(sub)){dp[i] = dp[j] + 1;}}}// for(int i : dp){//     System.out.println(i + " ");// }return dp[s.length()] != -1 ? true : false;}
}
class Solution {public boolean wordBreak(String s, List<String> wordDict) {HashSet<String> set = new HashSet<>();for(int i = 0; i < wordDict.size(); i++){set.add(wordDict.get(i));}boolean[] dp = new boolean[s.length() + 1];// 初始化dp[0] = true;for(int i = 1; i < s.length(); i++){dp[i] = false;}// 递推逻辑  - 算是一种排列,所以先背包后物品for(int i = 0; i <= s.length(); i++){for(int j = 0; j < i; j++){// 左闭右开String sub = s.substring(j, i);// 只有当dp[j]为true的时候,才有必要去继续比较// 代表前一段可以被wordDict组成if(dp[j] == true && set.contains(sub)){dp[i] = true;}}}return dp[s.length()];}
}

学习时间:

  • 上午两个半小时,整理文档半小时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中文语音标注工具FunASR(语音识别)

全称 A Fundamental End-to-End Speech Recognition Toolkit&#xff08;一个语音识别工具&#xff09; 可能大家用过whisper&#xff08;openAi&#xff09;&#xff0c;它【标注英语的确很完美】&#xff0c;【但中文会出现标注错误】或搞了个没说的词替换上去&#xff0c;所…

【Fiddler】IDEA配置Fiddler

由于遇上了个迷之请求&#xff0c;接口调用正常&#xff0c;OkHttpClient调用正常&#xff0c;RestTemplate调用失败&#xff0c;所以想看看发送的报文是怎样的&#xff0c;所以就下了个Fiddler 问题 下载安装&#xff0c;以及如何安装证书&#xff0c;网上太多相同文章了&…

APP备案,最新获取安卓签名文件中MD5等信息方法

1.通过签名文件获取SHA1和SHA256 直接通过cmd执行命令 keytool -list -v -keystore xxxxx/xxx/xx/xxx.keystore输入后回车会提示输入密码库口令&#xff0c;直接输入Keystore密码&#xff08;输入过程中终端上不会显示&#xff0c;输完回车就行&#xff09; 2.获取md5 由于…

redis集群(cluster)笔记

1. 定义&#xff1a; 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序…

IDEA启动失败报错解决思路

IDEA启动失败报错解决思路 背景&#xff1a;在IDEA里安装插件失败&#xff0c;重启后直接进不去了&#xff0c;然后分析问题解决问题的过程记录下来。方便下次遇到快速解决。也是一种解决问题的思路&#xff0c;分享出去。 启动报错信息 Internal error. Please refer to https…

加索引后 sql loader-951

加索引后 sql loader-951 现象解决过程最终解决 现象 之前使用sqlldr正常&#xff0c;加表索引后使用sqlldr时 报错 SQL Loader-951 解决过程 百度&#xff0c;说可能是锁表&#xff08;或者表未提交&#xff09; 查看没有对应未commit数据&#xff0c;且没有锁表。查看对应…

【笔记 Python 01】基本数据类型、基本类型

文章目录 类型是否可转换基本类型汇总集合 set【创建】【添加元素】【删除】【清空】【差集】【交集】【并集】【update 批量更新】【set → numpy】 元组 tuple ()【描述】【优点】【元组的创建】【元组的插入】【删除元组】 字典 dict {}【创建空列表】【创建列表】【字典的获…

ke14--10章-1数据库JDBC介绍

注册数据库(两种方式),获取连接,通过Connection对象获取Statement对象,使用Statement执行SQL语句。操作ResultSet结果集 ,回收数据库资源. 需要语句: 1Class.forName("DriverName");2Connection conn DriverManager.getConnection(String url, String user, String…

抖音各加密参数说明和获取(含代码)

​X-Bogus&#xff1a;X-Bogus是一种防数据包伪造的一个参数&#xff0c; 又称为x伪造&#xff0c;主要用于反爬虫&#xff0c;这个是某节公司下面基础服务&#xff0c;这个反爬虫机制几乎用在了它所有的产品中&#xff0c;不过&#xff0c;只要是能正常使用&#xff0c;这些东…

什么是Non EC

今天在填一个表单时&#xff0c;里面有个Non EC的选项&#xff0c;不解其意。原来是欧盟成员国国民的意思&#xff0c;因为欧盟法规各方面比较严厉&#xff0c;所以会单列出来&#xff0c;作为一个条件。 互联网查询结果如下&#xff1a; Non-EC是指非欧盟&#xff08;EU&#…

PHP基础 - 常量字符串

常量 在PHP中,常量是一个简单值的标识符,定义后默认是全局变量,可以在整个运行的脚本的任何地方使用。常量由英文字母、下划线和数字组成,但数字不能作为首字母出现。 PHP中定义常量的方式是使用define()函数,其语法如下: bool define( string $name, mixed $value [,…

使用人工智能优化常见业务流程

在现代商业环境中&#xff0c;人工智能(AI)正在改变企业的运营方式。将人工智能集成到业务流程中可以提高效率和准确性&#xff0c;从而节省大量时间和成本。 这使员工能够专注于更具战略性的任务。人工智能在商业中的应用范围从自动化日常任务到提供高级分析&#xff0c;以做…

【mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar安装】linux安装mysql5.7

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

邮政快递单号查询入口,删除不需要的单号

批量查询邮政快递单号的物流信息&#xff0c;并删除不需要的单号。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&#xff0c;然后登录…

SimpleSQL

游戏和应用中的SQL集成 simpleSQL可将数据库存储集成到您的游戏或项目中。创建水平地图链接,存储球员的统计资料,保持库存规格,以及更多! 请注意,simpleSQL是本地数据库解决方案,不能连接到服务器数据库 将SQLite数据库附加到场景中的管理器 无需移动移动设备上的文件! 使…

LeetCode力扣每日一题(Java):20、有效的括号

一、题目 二、解题思路 1、我的思路 我看到题目之后&#xff0c;想着这可能是力扣里唯一一道我能秒杀的题目了 于是一波操作猛如虎写出了如下代码 public boolean isValid(String s) {char[] c s.toCharArray();for(int i0;i<c.length;i){switch (c[i]){case (:if(c[i]…

玩法题材创新的跑酷游戏,广告变现不止带来收益 | TopOn变现干货

跑酷游戏是一类永不落伍的游戏。从远古的红白机到现代的PC、手机&#xff0c;经典作品层出不穷&#xff0c;而提起手机端的跑酷游戏&#xff0c;相信大部分玩家脑海里的第一印象便是《神庙逃亡》和《地铁跑酷》这两款经典游戏&#xff0c;在上蹿下跳、左右挪移间躲避障碍&#…

2023年12月7日:QT实现登陆界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口设置this->resize(600,500);//重新设置窗口大小this->setWindowTitle("QQ-盗版");//设置窗口名为QQ-盗版this->setWindowIcon(QIcon("D:\\Qt\\funny\\pi…

VOS3000 在安装AXB时需要几个步骤

安装 VOS3000 AXB 模板需要按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保你已经在服务器上安装了 CentOS 或者其他 Linux 操作系统&#xff0c;并且已经完成了基本的系统设置和网络配置。 下载 VOS3000 软件包&#xff0c;并解压缩到服务器上的指定目录中。 进入…

[虚拟机]使用VM打开虚拟机电脑重启解决方案。

问题&#xff1a;打开虚拟机点击启动后&#xff0c;电脑会自动重启。&#xff08;WINDOWS10 20版本&#xff09; 解决步骤&#xff1a; 1、对Windows功能进行操作。 上图三个启用。 上图一个取消。 再次打开后&#xff0c;不报警&#xff0c;显示下图问题&#xff1a; 继续解…