![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
力扣每日一题
文章平均质量分 58
Jagger-Q
大数据
展开
-
一篇文章带你搞懂动态规划问题
前言这篇博客主要是跟大家相互交流学习动态规划问题,下面记录的是一些我的学习心得。有不足的情况还望大家私聊交流指正。我写这篇博客的思路大概是这样:首先解释下动态规划的关键概念,然后列出各种动态规划类型的题目,只要能够跟着我的博客完成之后的动态规划题目我觉得应该能够解决平时遇到的百分之90的动态规划的问题一、动态规划的四大组成部分1、确定状态状态在动态规划中的作用至关重要。简单理解状态就是我们需要一个数组,数组中的每个元素就是代表状态。确定状态需要两个关键意识:最后一步和子问题。(1)最后一步(可以原创 2021-02-05 16:24:07 · 495 阅读 · 2 评论 -
背包型动态规划——零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例:输入:coins = [1, 2, 5], amount = 11输出:3 解释:11 = 5 + 5 + 1示例 2:提示:1 <= coins.length <= 121 <= coins[i] <= 231 - 10 <= amount <.原创 2021-02-05 16:23:06 · 326 阅读 · 1 评论 -
划分型动态规划——解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。题目数据保证答案肯定是一个 32 位的整数。示例 1:输入:s = "12"输出:2解释:它可以解码为 "AB"(1 2)或者 "L"(12)。示例 2:1、题目分析从题目的提问方式能够很明显的看出这是一个技术类型的动态规划。2、确定状态解密数字串即划分成若干数字,每段数字对应一个字母。最后一步(最后.原创 2021-02-05 16:22:48 · 182 阅读 · 0 评论 -
划分型动态规划——完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3 解释: 12 = 4 + 4 + 4.1、题目分析从题目的提问方式,能够很明显的看出这是个最值类型的动态规划。2、确定状态最后一步:关注最后策略中最后一个完全平方数j*j;最后策略中n-j*j也一定被划分成最少的完全平方数之和。因此我们可以假设f[i]表示i最少被分成几个完全平方数之和3、转移方程假设f[i].原创 2021-02-05 16:22:33 · 174 阅读 · 0 评论 -
划分型动态规划——分割回文串2
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回符合要求的最少分割次数。示例:输入: "aab"输出: 1解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。1、题目分析从题目提问方式,能够很明显的看出这是个最值类型的和划分类型的动态规划。2、确定状态最后一步:关注最优策略中最后一段回文串,设为S [j……N-1]。需要知道S前j个字符[0……j-1]最少可以划分成几个回文串。因此我们可以假设f[i]表示S的前i个字符S[0……i-.原创 2021-02-05 16:22:16 · 199 阅读 · 0 评论 -
划分型动态规划——书籍复制
给定 n 本书, 第 i 本书的页数为 pages[i]. 现在有 k 个人来复印这些书籍, 而每个人只能复印编号连续的一段的书, 比如一个人可以复印 pages[0], pages[1], pages[2], 但是不可以只复印 pages[0], pages[2], pages[3] 而不复印 pages[1].所有人复印的速度是一样的, 复印一页需要花费一分钟, 并且所有人同时开始复印. 怎样分配这 k 个人的任务, 使得这 n 本书能够被尽快复印完?返回完成复印任务最少需要的分钟数.样例 1:.原创 2021-02-05 16:21:59 · 297 阅读 · 0 评论 -
区间型动态规划——最长回文子序列
给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。示例 1:一个可能的最长回文子序列为 “bbbb”。输入:"bbbab"输出:4一个可能的最长回文子序列为 “bbbb”。1、题目分析这个题目可以划分为序列类型的动态规划,也可以划作为区间类型的动态规划。就我个人的思想而言,更接近区间类型的动态规划。2、确定状态最优策略产生最长的回文子串T,长度是M• 情况1:回文串长度是1,即一个字母• 情况2:回文串长度大于1,那么必.原创 2021-02-05 16:23:14 · 332 阅读 · 0 评论 -
背包型动态规划——背包问题6
给出一个都是正整数的数组 nums,其中没有重复的数。从中找出所有的和为 target 的组合个数。示例:输入: nums = [1, 2, 4] 和 target = 4输出: 6解释:可能的所有组合有:[1, 1, 1, 1][1, 1, 2][1, 2, 1][2, 1, 1][2, 2][4]1、题目分析和背包问题5唯一的区别是:组合中数字可以按照不同的顺序组合2、确定状态最后一步:最后一个物品重量是多少• 如果最后一个物品重量是A0 , 则要求有多少种组合能拼成.原创 2021-02-04 14:21:51 · 165 阅读 · 0 评论 -
背包型动态规划——背包问题3
给定 n 种物品, 每种物品都有无限个. 第 i 个物品的体积为 A[i], 价值为 V[i].再给定一个容量为 m 的背包. 问可以装入背包的最大价值是多少?样例 1:输入: A = [2, 3, 5, 7], V = [1, 5, 2, 4], m = 10输出: 15解释: 装入三个物品 1 (A[1] = 3, V[1] = 5), 总价值 15.样例 2:输入: A = [1, 2, 3], V = [1, 2, 3], m = 5输出: 5解释: 策略不唯一. 比如, 装入.原创 2021-02-04 14:21:36 · 180 阅读 · 0 评论 -
背包型动态规划——背包问题5
给出 n 个物品, 以及一个数组, nums[i] 代表第i个物品的大小, 保证大小均为正数, 正整数 target 表示背包的大小, 找到能填满背包的方案数。每一个物品只能使用一次给出候选物品集合 [1,2,3,3,7] 以及 target 7结果的集合为:[7][1,3,3]返回 21、题目分析从题目的提问方式可以看出是属于典型的计数类型的动态规划。2、确定状态需要知道N个物品有多少种方式拼出重量W (W =0, 1, …, Target)最后一步:第N个物品(重量AN-1 ).原创 2021-02-04 14:21:20 · 167 阅读 · 0 评论 -
背包型动态规划——背包问题1
在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]示例:样例 1: 输入: [3,4,8,5], backpack size=10 输出: 9样例 2: 输入: [2,3,5,7], backpack size=12 输出: 121、题目分析首先要明确一点,在背包问题中,数组大小和总称重有关。给定N个物品,重量分别为正整数A0, A1, …, AN-1。一个背包最大承重是M,物品的重量都是整数。每个装物品的方案的总重量都是0到M。如.原创 2021-02-04 14:21:02 · 256 阅读 · 0 评论 -
区间型动态规划——预测赢家
给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。示例:输入:[1, 5, 2]输出:False解释:一开始,玩家1可以从1和2中进行选择。如果他选择 2(或者 1 ),那么玩家 2 可以从.原创 2021-02-04 14:20:31 · 157 阅读 · 1 评论 -
双序列型动态规划——最长公共子序列
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。示例 1:输入:text1 = "abcde", text2 = "ace.原创 2021-02-04 14:20:12 · 233 阅读 · 2 评论 -
双序列型动态规划——交错字符串
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:s = s1 + s2 + … + snt = t1 + t2 + … + tm|n - m| <= 1交错 是 s1 + t1 + s2 + t2 + s3 + t3 + … 或者 t1 + s1 + t2 + s2 + t3 + s3 + …提示:a + b 意味着字符串 a 和 b 连接。示例.原创 2021-02-04 14:19:50 · 173 阅读 · 0 评论 -
双序列型动态规划——编辑距离
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')1、确定状态设A长度是m,B长度是n全部操作完成.原创 2021-02-04 14:19:33 · 191 阅读 · 0 评论 -
双序列型动态规划——不同的子序列
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)题目数据保证答案符合 32 位带符号整数范围。示例 1:输入:s = "rabbbit", t = "rabbit"输出:3解释:如下图所示, 有 3 种可以从 s 中得到 "rabbit" 的方案。(上箭头符号 ^ 表示选取的字母).原创 2021-02-04 14:18:54 · 161 阅读 · 0 评论 -
背包型动态规划——背包问题2
有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.问最多能装入背包的总价值是多大?样例 :输入: m = 10, A = [2, 3, 5, 7], V = [1, 5, 2, 4]输出: 9解释: 装入 A[1] 和 A[3] 可以得到最大价值, V[1] + V[3] = 9 1、题目分析我的理解:这个题目完全跟背包问题1类似,只不过在转移方程中重量改为了价值。因此假设f[i][w] 表示用前i个物品拼出重量w时最大总价值2、.原创 2021-02-04 14:20:46 · 164 阅读 · 0 评论 -
博弈型动态规划——硬币排成一条线
有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。请判定 先手玩家 必胜还是必败?若必胜, 返回 true, 否则返回 false.样例样例 1:输入: 1输出: true样例 2:输入: 4输出: true解释: 先手玩家第一轮拿走一个硬币, 此时还剩三个.这时无论后手玩家拿一个还是两个, 下一次先手玩家都可以把剩下的硬币拿完.1、题目分析这是典型的博弈类型的动态规划题目2、确定状态博弈类型的动态规划原创 2021-02-03 21:57:05 · 418 阅读 · 0 评论 -
序列型动态规划——俄罗斯套娃信封问题
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]输出: 3 解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。1、原创 2021-02-03 21:55:31 · 211 阅读 · 0 评论 -
序列型动态规划——最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 :输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。1、题目分析这是典型的序列类型动态规划题目。2、确定状态最后一份:对于最优的策略,一定有最后一个元素a[j]。第一种情况:最原创 2021-02-03 21:54:35 · 197 阅读 · 0 评论 -
序列型动态规划——打家劫舍2
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。示例1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。原创 2021-02-03 21:53:36 · 154 阅读 · 0 评论 -
序列类型动态规划——打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。1、题目分析根据题目的提原创 2021-02-03 21:51:40 · 154 阅读 · 0 评论 -
序列型动态规划——粉刷房子
假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的矩阵来表示的。例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。请你计算出粉刷完所有房子最少的花费成本。注意:所有花费均为正整数。示例原创 2021-02-03 21:50:22 · 332 阅读 · 0 评论 -
坐标型动态规划——不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下 -> 向右 -> 向下1、题目分析从题目中应该原创 2021-02-03 21:48:54 · 236 阅读 · 0 评论 -
位操作型动态规划——比特位计数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]1、题目分析从题目中的二进制数能够比较明显的看出该题目属于位操作型动态规划,同时属于计数型的动态规划2、确定状态这个的最后一步应该很好理解,就是它的最后一位二进制位,举个例子:170=10101010,它的最后一位是0,去掉它的最后一位则剩下的数就是85=1010101。因此我们如果要求170的二进制有多个1,只需要原创 2021-02-03 21:47:14 · 193 阅读 · 0 评论 -
坐标型动态规划——轰炸敌人
想象一下炸弹人游戏,在你面前有一个二维的网格来表示地图,网格中的格子分别被以下三种符号占据:‘W’ 表示一堵墙‘E’ 表示一个敌人‘0’(数字 0)表示一个空位请你计算一个炸弹最多能炸多少敌人。(最值类型)由于炸弹的威力不足以穿透墙体,炸弹只能炸到同一行和同一列没被墙体挡住的敌人。注意:你只能把炸弹放在一个空的格子里示例:输入: [["0","E","0","0"],["E","0","W","E"],["0","E","0","0"]]输出: 3 解释: 对于如下网格0 E 0原创 2021-02-03 21:45:33 · 788 阅读 · 0 评论 -
坐标型动态规划——最小路径和
给定一个包含非负整数的 m*n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:grid = [[1,5,7,6,8],[4,5,4,4,9],[10,3,2,3,2]]输出:22解释:因为路径 1→4→7→7→3→3→2 的总和最小。1、确定状态我们的最终目的是为了到达右下角,假设右下角坐标为(n-1,m-1),因此最后一步要么(n-2,m-1)向下要么(n-1,m-2)向右。如果倒数第二步在(n-1,m原创 2021-02-03 21:41:54 · 251 阅读 · 0 评论 -
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
首先贴出代码:#include <iostream>using namespace std;int f(int n){ n && (n+=f(n-1)); return n;}int main(){ int n; cin>n; cout<<f(n)<<endl; return 0;}本题常用的解题方法有:for循环、递归;因为题目规定不能使用for关键词,显然for循环不能使用;而递归的出口处要原创 2020-06-02 16:04:33 · 380 阅读 · 0 评论