LeetCode hot100---动态规划专题(C++语言)

news2024/10/6 3:32:39

动态规划理论

动态规划搞清楚dp数组的含义,j代表什么,dp[j]代表什么。

1、爬楼梯

(1)题目描述以及输入输出

(1)题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

(2)输入输出描述:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 12. 2 阶

关键思路:
第三阶可以是第二阶跨1步上去,也可以是第1阶跨两步上去。
i代表阶数,dp[i]代表需要的步数

(2)代码块

class Solution {
public:
    int climbStairs(int n) 
    {
        vector<int> dp(n+1,0);
        dp[1] = 1;
        dp[2] = 2;
        for(int i = 3;i<=n;++i)
        {
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[n];
    }
};

2、杨辉三角

(1)题目描述以及输入输出

(1)题目描述:
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

(2)输入输出描述:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

关键思路:
初始化每行为1
tmp[j] = record[i-1][j-1] + record[i-1][j];计算每行数据

(2)代码块

class Solution {
public:
    vector<vector<int>> generate(int numRows) 
    {
        vector<vector<int>> record;
        for(int i = 0;i<numRows;++i)
        {
            vector<int> tmp(i+1,1);		// 每一行初始化为1
            for(int j = 1;j<i;j++)
            {
                tmp[j] = record[i-1][j-1] + record[i-1][j];
            }
            record.push_back(tmp);
        }
        return record;
    }
};

3、打家劫舍

(1)题目描述以及输入输出

(1)题目描述:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

(2)输入输出描述:
输入:[1,2,3,1]
输出:4

关键思路:
i代表第几家,dp[i]代表盗窃的最高金额。相邻两家会触发警报。因此dp[i] = max(dp[i-1],dp[i-2]+nums[i])

(2)代码块

class Solution {
public:
    int rob(vector<int>& nums) 
    {
        vector<int> dp(nums.size(),0);
        if(nums.size()==1)
            return nums[0];
        dp[0] = nums[0];
        dp[1] = max(nums[0],nums[1]);
        
        for(int i = 2;i<nums.size();++i)
        {
            dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[nums.size()-1];
    }
};

4、零钱兑换

(1)题目描述以及输入输出

(1)题目描述:
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。

(2)输入输出描述:
输入:coins = [1, 2, 5], amount = 11
输出:3 

关键思路:
i代表目标钱币,dp[i]代表凑齐该钱币需要的最少钱币数。本质还是暴力循环,遍历第二个钱币时,可以使用第一种钱币凑出

(2)代码块

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) 
    {
        vector<int> dp(amount+1,INT_MAX);
        dp[0] = 0;
        for(int i = 0;i<coins.size();++i)           // 遍历每个硬币
        {
            for(int j = coins[i];j<=amount;++j)     // 使用该硬币凑出金额
            {
                if(dp[j-coins[i]] != INT_MAX)
                    dp[j] = min(dp[j],dp[j-coins[i]]+1);
            }
        }
        if(dp[amount] == INT_MAX)return -1;
        return dp[amount];
    }
};

5、完全平方数

(1)题目描述以及输入输出

(1)题目描述:
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 

(2)输入输出描述:
输入:n = 12
输出:3  

关键思路:
平方数作为物品,目标数作为背包

(2)代码块

class Solution {
public:
    int numSquares(int n) 
    {
        vector<int> dp(n+1,INT_MAX);
        dp[0] = 0;
        
        for(int i = 1;i*i<=n;++i)                   // 遍历每个数
        {
            for(int j = i*i;j<=n;++j)               // i*i->n作为背包
            {
                if(dp[j-i*i] != INT_MAX)
                    dp[j] = min(dp[j],dp[j-i*i]+1); // 使用
            }
        }
        
        return dp[n];
    }
};

6、最小路径和

(1)题目描述以及输入输出

(1)题目描述:
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

(2)输入输出描述:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。 

关键思路:
dp[i][j]代表走到这个格子需要的最小路径,先初始化上,左边界。
dp[i][j] += min(dp[i-1][j],dp[i][j-1])+grid[i][j];	// 上次最短路径+本次路径

(2)代码块

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) 
    {
        vector<vector<int>> dp(grid.size(),vector<int>(grid[0].size()));
        dp[0][0] = grid[0][0];					
        for(int i = 1;i<grid.size();++i)
            dp[i][0] = dp[i-1][0] +grid[i][0];
        for(int i = 1;i<grid[0].size();++i)
            dp[0][i] = dp[0][i-1] + grid[0][i];

        for(int i = 1;i<grid.size();++i)
        {
            for(int j = 1;j<grid[0].size();++j)
                dp[i][j] += min(dp[i-1][j],dp[i][j-1])+grid[i][j];
        }
        return dp[grid.size()-1][grid[0].size()-1];
    }
};

7、不同路径

(1)题目描述以及输入输出

(1)题目描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

(2)输入输出描述:
输入:m = 3, n = 7
输出:28

关键思路:
record[i][j]代表走到i,j的不同走法
record[i][j] = record[i-1][j] + record[i][j-1];

(2)代码块

class Solution {
public:
    int uniquePaths(int m, int n)
    {
        vector<vector<int>> record(m, vector<int>(n, 0));;
        for(int i = 0;i<m;++i)
        {
            record[i][0] = 1;
        }
        for(int i = 0;i<n;++i)
        {
            record[0][i] = 1;
        }
        for(int i = 1;i<m;++i)
        {
            for(int j = 1;j<n;++j)
            {
                record[i][j] = record[i-1][j] + record[i][j-1];
            }
        }
        return record[m-1][n-1];
    }
};

8、单词拆分

(1)题目描述以及输入输出

(1)题目描述:
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。

(2)输入输出描述:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true

关键思路:
遍历字符串,分割字符串,dp[i]代表前i个字符是否可拼接

(2)代码块

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) 
    {
        unordered_set<string> record(wordDict.begin(),wordDict.end());
        vector<bool> dp(s.length()+1,false);
        dp[0] = true;
        for(int i = 1;i<=s.length();++i)        // dp[i]表示前i个字符是否可以被拼接 
        {
            for(int j = 0;j<i;++j)
            {   
                string str = s.substr(j,i-j);
                if(dp[j] && record.count(str))  // 若前j字符可拼接且在哈希表中找到剩余字符,仍可拼接
                    dp[i] = true;
            }
        }
        return dp[s.length()];
    }
};

9、最长递增子序列

(1)题目描述以及输入输出

(1)题目描述:
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的
子序列


(2)输入输出描述:
输入:nums = [10,9,2,5,3,7,101,18]
输出:4

关键思路:
i表示第几个序列,dp[i]表示当前序列的最长子序列的值

(2)代码块

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) 
    {
        vector<int> dp(nums.size(),1);
        int maxsize = 1;

        for(int i = 1;i<nums.size();++i)    // 先遍历背包,再遍历物品
        {
            for(int j = 0;j<i;++j)          // 子序列是物品
            {
                if(nums[i] > nums[j])       // 是递增序列
                {
                    dp[i] = max(dp[i],dp[j]+1);
                    maxsize = max(maxsize,dp[i]);
                }
            }
        }
        return maxsize;

    }
};

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

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

相关文章

8月AI绘画方向APP用户量及人均时长排行榜

全球用户量Top10&#xff08;APP&#xff09; 排名 产品名 分类 8月MAU 上月对比 1 Remini 人工智能修图 29.14M -0.88% 2 FaceApp AI 人脸编辑器 26.46M 0.14% 3 Hypic Photo Editor & AI Art 17.37M 5.74% 4 AI Mirror AI Art Photo Editor 16.81…

【第三版 系统集成项目管理工程师】第16章 监理基础知识

持续更新。。。。。。。。。。。。。。。 【第三版】第十六章 监理基础知识 16.1 监理的意义和作用1.监理的地位和作用(非重点)-P5692.监理的重要性与迫切性-P5703.监理技术参考模型-P570 16.2 监理相关概念1.信息系统工程监理-P5722.信息系统工程监理单位-P5723.业主单位-P57…

LeNet学习

Lenet是一个 7 层的神经网络&#xff0c;包含 3 个卷积层&#xff0c;2 个池化层&#xff0c;1 个全连接层。其中所有卷积层的所有卷积核都为 5x5&#xff0c;步长 strid1&#xff0c;池化方法都为全局 pooling&#xff0c;激活函数为 Sigmoid&#xff0c;网络结构如下&#xf…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

ffmpeg面向对象——拉流协议匹配机制探索

目录 1.URLProtocol类2.协议匹配的基础接口3. URLContext类4. 综合调用流程图5.rtsp拉流协议匹配流程图及对象图5.1 rtsp拉流协议调用流程图5.2 rtsp拉流协议对象图 6.本地文件调用流程图及对象图6.1 本地文件调用流程图6.2 本地文件对象图 7.内存数据调用流程图及对象图7.1 内…

李宏毅深度学习-梯度下降和Batch Normalization批量归一化

Gradient Descent梯度下降 ▽ -> 梯度gradient -> vector向量 -> 下图中的红色箭头&#xff08;loss等高线的法线方向&#xff09; Tip1: Tuning your learning rates Adaptive Learning Rates自适应lr 通常lr会越来越小 Adaptive Learning Rates中每个参数都给它不…

基于依赖注入技术的.net core WebApi框架创建实例

依赖注入&#xff08;Dependency Injection, DI&#xff09;是一种软件设计模式&#xff0c;用于实现控制反转&#xff08;Inversion of Control, IoC&#xff09;。在ASP.NET Core中&#xff0c;依赖注入是内置的核心功能之一。它允许你将应用程序的组件解耦和配置&#xff0c…

【JAVA开源】基于Vue和SpringBoot的服装生产管理系统

本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【LVGL进阶日记】① 开源LVGL在MCU上的移植

关注+星标公众号,不错过精彩内容 作者 | 量子君 微信公众号 | 极客工作室 【LVGL进阶日记】专栏目录 第一章 开源LVGL在MCU上的移植 文章目录 前言一、LVGL介绍1.1 LVGL的主要特性如下:1.2 LVGL对MCU的要求如下:二、移植LittlevGL到MCU2.1 LVGL源码下载和文件组织2.2 LVGL配…

【AI人工智能】文心智能体,你的情诗小助理,哄女朋友必备, 低代码工作流易上手,干货满满,不容错过哦

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

数字图像处理项目——基于Unet网络实现MRI图像的双肺区域分割(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 在医学图像处理领域&#xff0c;肺部图像的分割是一个重要的研究方向&#xff0c;特别是针对肺部疾病的检测与诊断。传统的X射线和CT&#xff08;计算机断层扫描&#xff09;是常用的肺部成像技术&#xff0c;但MRI&#xff08…

I/O多路转接

目录 一、select 1.1、select概念 1.2、select 函数原型 1.3、理解 select 执行过程 1.4、select就绪条件 1.4.1、读就绪 1.4.2、写就绪 1.4.3、异常就绪&#xff08;了解&#xff09; 1.5、select 基本工作流程 1.6、select服务器 1.6.1、Sock.hpp 1.6.2、selectS…

python实战四:输入一个年份,判断是否是闰年

问题&#xff1a; 从键盘获取一个四位的整数年份&#xff0c;判断其是否是闰年。闰年的判断条件为︰能被4整除但不能被100整除&#xff0c;或者能被400整除。 需求方法&#xff1a; 使用 input() 函数从键盘获取输入。输入的年份是一个字符串。检查输入是否为四位数&#xf…

Elasticsearch学习笔记(四) Elasticsearch集群安全配置一

继续我们的实验。先谈一下我对Elasticsearch粗浅的一些认识&#xff0c;首先Elasticsearch是一个非常宏大的技术栈&#xff0c;发展到今天围绕着Elasticsearch已经产生了更多的组件、套件。因此在看官方文档或者别人的一些教程的时候经常会遇到ELK,elastic stack等。elastic st…

如何在电脑上浏览手机界面

联想浏览器中&#xff0c;点击右键-》检查&#xff0c;进入开发者工具&#xff1a; 点击如上&#xff0c;红色框框选中的手机浏览模式即可。

【微服务】服务注册与发现、分布式配置管理 - Nacos

概述 Nacos是阿里巴巴旗下的一个开源产品&#xff0c;目前市场使用率还是比较高的。在最初开源时&#xff0c;Nacos选择内部三个产品合并并统一开源&#xff0c;这三个产品分别是&#xff1a;非持久化注册中心&#xff08;Configserver&#xff09;、持久化注册中心&#xff0…

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…

腾讯自研Git客户端,助力每个人都可以轻松使用Git

工具介绍 UGit是一款腾讯自研的Git客户端&#xff0c;为了让每个人都可以轻松使用Git&#xff0c;从而提高开发效率和团队协作的流畅性。支持工蜂MR/CR&#xff0c;工蜂议题管理&#xff0c;另外对于Git的原生特性有着深度支持。 支持的系统 支持macOS 10.11、Apple Silicon和…

【数据结构】什么是哈希表(散列表)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;哈希表的概念 &#x1f4cc;哈希函数的构造方法 &#x1f38f;直接定址法 &#x1f38f;除留余数法 &#x1f38f;平方取中法 &#x1f38f;折叠法 &#x…

自动驾驶的技术实现及原理

自动驾驶技术是现代科技领域中一项引人注目的创新&#xff0c;它具有变革运输行业并提升道路安全的潜力。随着人工智能、传感器技术以及数据处理能力的不断提升&#xff0c;自动驾驶车辆已经从实验室研究逐渐走向现实应用。 自动驾驶的技术实现及原理 1. 自动驾驶技术的核心…