![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 91
MD_
不拼一下 你怎么知道你不会成功!
展开
-
Leetcode 392. 判断子序列【简单的字符串匹配, 涉及一对一和多对一的匹配问题】
文章目录问题描述解题报告实现代码参考资料问题描述给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 1:s = “abc”, t = “ahbgdc”返回 true.示例原创 2020-07-27 09:17:15 · 284 阅读 · 0 评论 -
石子游戏系列【博弈论+动态规划】
文章目录Leetcode 877.石子游戏问题描述解题报告实现代码Leetcode 1140. 石子游戏 II问题描述解题报告实现代码Leetcode 1406. 石子游戏 III问题描述解题报告实现代码总结参考资料Leetcode 877.石子游戏问题描述亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。原创 2020-06-25 20:21:37 · 836 阅读 · 1 评论 -
Leetcode 1483. 树节点的第 K 个祖先【倍增法】
文章目录问题描述解题报告实现代码参考资料问题描述给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。请你设计并实现 getKthAncestor(int node, int k) 函数,函数返回节点 node 的第 k 个祖先节点。如果不存在这样的祖先节点,返回 -1 。树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。输入:[“TreeAncestor”,“ge原创 2020-06-20 11:44:57 · 468 阅读 · 0 评论 -
Leetcode 639. 解码方法 2【空间优化的动态规划】
文章目录问题描述解题报告实现代码参考资料问题描述一条包含字母 A-Z 的消息通过以下的方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26除了上述的条件以外,现在加密字符串可以包含字符 '‘了,字符’'可以被当做1到9当中的任意一个数字。给定一条包含数字和字符’*'的加密信息,请确定解码方法的总数。同时,由于结果值可能会相当的大,所以你应当对109 + 7取模。(翻译者标注:此处取模主要是为了防止溢出)示例 1 :输入: “*”输出: 9解释: 加原创 2020-06-10 11:20:07 · 184 阅读 · 0 评论 -
Leetcode 873. 最长的斐波那契子序列的长度【动态规划】
文章目录问题描述解题报告实现代码参考资料问题描述如果序列 X_1, X_2, …, X_n 满足下列条件,就说它是 斐波那契式 的:n >= 3对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是原创 2020-06-04 13:56:07 · 158 阅读 · 0 评论 -
Leetcode 837. 新21点【动态规划】
文章目录问题描述解题报告实现代码参考资料问题描述爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?示例 1:输入:N = 10, K = 1, W = 10输出:1.00000说明:爱丽丝得到一张卡,原创 2020-06-03 13:39:04 · 176 阅读 · 0 评论 -
单词拆分系列
文章目录Leetcode 139. 单词拆分问题描述解题报告实现代码Leetcode 140. 单词拆分 II问题描述解题报告实现代码参考资料Leetcode 139. 单词拆分问题描述给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输原创 2020-06-01 17:08:21 · 1025 阅读 · 0 评论 -
Leetcode 1014.最佳观光组合【勉强算是动态规划】
文章目录问题描述解题报告实现代码参考资料问题描述给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。示例:输入:[8,1,5,2,6]输出:11解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11解题报告以原创 2020-05-13 17:16:02 · 217 阅读 · 0 评论 -
Leetcode 面试题 08.11. 硬币【动态规划&回溯法(超时)】
文章目录问题描述解题报告回溯法[TLE]动态规划实现代码回溯法动态规划实现参考资料问题描述硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算 n 分有几种表示法。(结果可能很大,你需要将结果模上1000000007)解题报告回溯法[TLE]这题和 Leetcode 39.组合总数题意相同,只是求解的内容不一样。解释见:Leetcode. 组合总和【回溯法+人为定义...原创 2020-04-25 23:29:07 · 366 阅读 · 0 评论 -
Leetcode 740. 删除与获得点数【动态规划:以数组下标作为索引 or 以数组中的值作为索引 看数据大小关系】
文章目录问题描述解题报告以数组下标作为索引以数组中的值作为索引实现代码以数组下标作为索引实现以数组中的值作为索引实现总结参考资料问题描述给定一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通...原创 2020-04-20 12:39:48 · 159 阅读 · 0 评论 -
Leetcode 198. 打家劫舍【动态规划,一步步从最粗暴的动态规划到最优化滚动数组实现】
文章目录问题描述解题报告最简单粗暴的动态规划优化版动态规划滚动数组版动态规划实现代码最简单粗暴的动态规划实现优化版动态规划实现滚动数组版动态规划实现总结参考资料问题描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组...原创 2020-04-20 11:31:57 · 315 阅读 · 0 评论 -
Leetcode 887. 鸡蛋掉落【动态规划】
文章目录问题描述解题报告实现代码参考资料问题描述你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它...原创 2020-04-11 15:34:09 · 142 阅读 · 0 评论 -
Leetcode 面试题48. 最长不含重复字符的子字符串【动态规划】
文章目录问题描述解题报告实现代码参考资料问题描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。解题报告dp[i]dp[i]dp[i] 表示以第 iii 个字符结尾的最长子字符串的长度。记 dp[i−1]dp[i-1]dp[i−1] 的起始位置为 ppp求 dp[i]dp[i]dp[i] 时:逆序遍历 s[i−1],s[i−2],⋯ ,s[p]s[i-...原创 2020-04-10 18:55:59 · 407 阅读 · 0 评论 -
Leetcode 面试题49.丑数【优先队列|动态规划】
文章目录问题描述解题报告优先队列动态规划实现代码优先队列动态规划参考资料问题描述我们把只包含质因子2、3和5的数称为丑数。求按从小到大的顺序的第n个丑数。解题报告由于丑数 只 包含质因子2,3,5,因此较大的丑数可以由较小的丑数依次乘以上述质因子得到。优先队列同时构建一个优先队列和集合。每次从队列中取出一个最小的数,将这个数依次乘以三个因子,然后判断三个新得的三个数是否在集合中,如果...原创 2020-04-08 12:34:12 · 146 阅读 · 0 评论 -
Leetcode 139.单词拆分& Leetcode 55. 跳跃游戏【逆序再查找】
文章目录Leetcode 139.单词拆分问题描述解题报告实现代码参考资料Leetcode 55. 跳跃游戏问题描述解题报告实现代码参考资料Leetcode 139.单词拆分问题描述给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。...原创 2020-04-06 17:22:21 · 184 阅读 · 0 评论 -
把数字翻译成字符串
文章目录问题描述解题报告实现代码问题描述给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。解题报告dp[i]dp[i]dp[i] 表示num中从第 1位到第i位的翻译方法数。则第 i 位可以单独成一位,或者和第...原创 2020-03-31 21:10:02 · 176 阅读 · 0 评论 -
Leetcode 面试题 17.16. 按摩师
文章目录问题描述解题报告实现代码问题描述一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间都要休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。输入:[1,2,3,1]输入:[1,2,3,1]输入:[1,2,3,1]输出:4输出:4输出:4解题报告动态规划当我们回看转移方程时...原创 2020-03-24 08:00:02 · 74 阅读 · 0 评论 -
Leetcode 322. 零钱兑换【动态规划&贪心算法+回溯】
文章目录问题描述解题报告实现代码问题描述给定不同面额的硬币 coinscoinscoins 和一个总金额 amountamountamount。编写一个函数来计算可以凑成总金额所需的最小的硬币个数、如果没有任何一种硬币组合能组成总金额,返回 −1-1−1。输入:coins=[1,2,5],amount=11coins=[1, 2, 5], amount=11coins=[1,2,5],amo...原创 2020-03-12 21:30:56 · 858 阅读 · 0 评论 -
Leetcode 300. 最长上升子序列【动态规划&贪心+二分】
文章目录问题描述解题报告实现代码问题描述解题报告dp[i]dp[i]dp[i] 表示以第 iii 个数结尾的最长上升子序列的长度。实现代码class Solution {public: int lengthOfLIS(vector<int>& nums) { int n=nums.size(); int ans=-214...原创 2020-02-07 10:23:45 · 271 阅读 · 0 评论 -
Leetcode 357. 计算各个位数不同的数字个数
文章目录问题描述解题报告实现代码问题描述解题报告手动模拟一下即可实现代码class Solution {public: int countNumbersWithUniqueDigits(int n) { if(n==0) return 1; if(n==1) return 10; ...原创 2019-12-09 15:12:50 · 131 阅读 · 0 评论 -
Leetcode 221. 最大正方形 & Leetcode 1277. 统计全为 1 的正方形子矩阵
文章目录问题描述解题报告实现代码问题描述Leetcode 221. 最大正方形Leetcode 1277. 统计全为 1 的正方形子矩阵解题报告状态定义:dp[i][j]dp[i][j]dp[i][j] 表示以 (i,j)(i,j)(i,j) 作为右下角的的最大边长,则:状态转移dp[i][j]=min(min(dp[i−1][j],dp[i][j−1]),d...原创 2019-12-08 17:42:41 · 762 阅读 · 0 评论 -
Leetcode 62. 不同路径&Leetcode 64. 最小路径和
文章目录问题描述解题报告实现代码问题描述Leetcode 62. 不同路径Leetcode 64. 最小路径和解题报告针对不同路径这道题:状态定义:dp[i][j]dp[i][j]dp[i][j] 表示从左上角到达坐标 (i,j)(i,j)(i,j) 的总共的路径数。状态转移:dp[i][j]=dp[i−1][j]+dp[i][j−1]dp[i][j]=dp[i-...原创 2019-12-06 14:52:30 · 133 阅读 · 0 评论 -
Leetcode 72. 编辑距离 & Leetcode 583. 两个字符串的删除操作
文章目录问题描述解题报告实现代码问题描述Leetcode 72. 编辑距离Leetcode 583. 两个字符串的删除操作解题报告dp[i][j]dp[i][j]dp[i][j] 表示 word1[1⋯i]word1[1\cdots i]word1[1⋯i] 和 word2[1⋯j]word2[1\cdots j]word2[1⋯j]所需的最少操作数。针对 编辑距离...原创 2019-12-04 14:31:34 · 414 阅读 · 0 评论 -
51Nod 1009 数字1的数量
描述题解dp[pos][state]:表示当前处于pos数位,前一数位的值为state时,数字1的数量若当前枚举的数字为最高数位最大值且为1时,通过函数sum求由这个1新增的1的数量若当前枚举数字为1但不是最高数位最大值时,pow(10, pos + 1)即为这个1新增的1的数量注意:dp[pos][state]仅能表示当前数位和前一数位的状态,举个例子来说,dp[1][0]可以表示百...原创 2019-04-03 09:38:36 · 175 阅读 · 0 评论 -
51Nod 1042 数字0-9的数量
描述题解同51Nod1009 https://blog.csdn.net/qq_27690765/article/details/88988188***转自:***https://blog.csdn.net/zwj1452267376/article/details/52894813代码#include<iostream>#include<cmath>#in...原创 2019-04-05 13:38:21 · 131 阅读 · 0 评论 -
Leetcode 718. 最长重复子数组
文章目录问题描述解题报告实现代码问题描述解题报告此题是最长公共子数组,注意与最长公共子序列不同;对于最长公共子数组实现代码class Solution {public: int findLength(vector<int>& A, vector<int>& B) { int m=A.size(),n=B.size(...原创 2019-11-30 20:51:51 · 161 阅读 · 1 评论 -
Leetcode 474. 一和零
文章目录问题描述解题报告实现代码问题描述解题报告背包问题。实现代码*我的代码class Solution{ public: int findMaxForm(vector<string>&strs,int m,int n){ int size=strs.size(); vector<v...原创 2019-11-30 17:41:27 · 76 阅读 · 0 评论 -
Leetcode 516. 最长回文子序列
文章目录问题描述解题报告代码实现问题描述解题报告dp[i][j]dp[i][j]dp[i][j] 表示 sss 的第 iii 个字符到第 jjj 个字符组成的子串中,最长的回文序列长度是多少。所以:if s[i]==s[j]⟶dp[i][j]=dp[i+1][j−1]+2if s[i]≠s[j]⟶dp[i][j]=max(dp[i+1][j],dp[i][j−1])if \;s...原创 2019-11-17 15:49:56 · 113 阅读 · 0 评论 -
Leetcode 1024. 视频拼接
文章目录问题描述解题报告实现代码问题描述解题报告dp[i]dp[i]dp[i] 表示剪辑到时间点 iii 所需要的最少碎片。所以我们可以得到如下的公式:dp[i]=min(dp[i],dp[v[0]]+1)v[0]表示对所有的视频片段进行遍历,取每个片段的开始点dp[i]=min(dp[i],dp[v[0]]+1)\\v[0]表示对所有的视频片段进行遍历,取每个片段的开始点dp...原创 2019-11-17 11:25:32 · 617 阅读 · 0 评论 -
Leetcode 279. 完全平方数
文章目录问题描述解题报告实现代码问题描述解题报告dp[i]dp[i]dp[i] 表示最小个数。需要注意的是:dp[0]=0dp[0]=0dp[0]=0 因为输入是正整数,所以若 iii 是完全平方数,则 dp[i]=1+dp[0]=1dp[i]=1+dp[0]=1dp[i]=1+dp[0]=1,即最少完全平方数为 i\sqrt ii实现代码class Solution {pu...原创 2019-11-15 17:19:22 · 61 阅读 · 0 评论 -
Leetcode 343. 整数拆分
文章目录问题描述解题报告实现代码问题描述解题报告方案一:dp[i]dp[i]dp[i] 表示拆分为至少两个正整数的和,并且最大化的乘积,则:dp[i]=max(j∗(i−j),j∗dp[i−j]) j<idp[i]=max(j*(i-j),j*dp[i-j])\;j<idp[i]=max(j∗(i−j),j∗dp[i−j])j<i第一项表示分成两个整数...原创 2019-11-15 16:44:18 · 79 阅读 · 0 评论 -
Leetcode 96. 不同的二叉搜索树
文章目录问题描述解题报告实现代码问题描述解题报告共有 nnn 个节点,每个节点都可当做根节点。当以节点 iii 作为根节点时,为符合二叉搜索树的性质,左节点个数是 iii,即 0、1⋯、i0、1\cdots、i0、1⋯、i ;右节点个数为 n−in-in−i,即 i、i+1⋯、ni、i+1\cdots、ni、i+1⋯、nC0=1Cn+1=∑i=0nCiCn−i for n≥0...原创 2019-11-14 15:54:10 · 102 阅读 · 0 评论 -
Leetcode 877. 石子游戏
文章目录问题描述解题报告实现代码问题描述解题报告dp[i][j]dp[i][j]dp[i][j] 表示先手与后手所获得的石子之差。dp[i][j]=max(piles[i]−dp[i+1][j],piles[j]−dp[i][j−1])dp[i][j]=max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1])dp[i][j]=max(piles[i...原创 2019-11-14 15:04:59 · 100 阅读 · 0 评论 -
Leetcode 983.最低票价
文章目录问题描述解题报告实现代码问题描述解题报告dp[i]dp[i]dp[i] 表示截止于 iii 天的最低消费。如果第 iii 天没有旅行计划,则 dp[i]=dp[i−1]dp[i]=dp[i-1]dp[i]=dp[i−1];如果第 iii 天有旅行计划,则判断1天前选择一张为期1天的通行证、7天前选择为期7天的通行证、30天前选择为期30天的通行证 哪一种更为合适。如果da...原创 2019-11-13 11:18:58 · 91 阅读 · 0 评论 -
Leetcode 338 比特位计数
题目链接问题描述题解ans[i]表示数字i中1的数量;偶数时,二进制的最后一位是0,所以1的数量是前面的数位的数字中1的个数,即ans[i/2]奇数时,二进制的最后一位时1,同上,1的数量为ans[i/2]+1代码class Solution {public: vector<int> countBits(int num) { vector<...原创 2019-10-25 15:00:10 · 138 阅读 · 0 评论 -
51Nod 1086 背包问题V2(多重背包)
描述题解求解时,注意计算的次序问题,因为从后面计算到前面,所以第一维要从后面到前面开始枚举。代码#include <iostream>#include <cstdio>#include<string.h>using namespace std;#define maxn1 105#define maxn2 50005int N,W;str...原创 2019-03-23 12:52:22 · 126 阅读 · 0 评论 -
51Nod 1101 换零钱
描述题解针对每种零钱,可以选择换或者选择不换。dp[i]:表示i分钱的换法for(int j=1;j<13;j++){ dp[i]=dp[i]+dp[i-mon[j]// dp[i]:不换该种零钱;dp[i-mon[j]]:换该种零钱}代码#include <iostream>#include<stdio.h>#include<str...原创 2019-03-24 10:20:48 · 107 阅读 · 0 评论 -
0/1背包问题
描述有n个重量和价值分别为wi和vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最小值题解dp[i][j]表示从第i个物品开始挑选总重小于j的物品时得到的最大价值显然,可以得到如下的递推表达式:void solve(){ for(int i=n-1;i>=0;i--){ for(int j=0;j<W;j++){ ...原创 2019-04-10 10:46:54 · 169 阅读 · 0 评论 -
51Nod 1050循环数组最大子段和
描述题解同最大子段和非常类似。不同的是,该题中的最大子段和可能出现在首尾处,在这种情况下,就相当于将整个数组取反,那么取反后的数组的最大子段和必然出现在中间部分,这种情况下的最大子段和为‘数组之和与最大子段和的加和’。代码#include <iostream>#include<stdio.h>#define maxn 50005long long sum=0...原创 2019-04-01 20:26:18 · 117 阅读 · 0 评论 -
hdu 2089 不要62
描述题解具体在代码中。需要注意的两点是:1)记忆化搜索时,为什么需要加上 if(!limit)这个判断条件2)为什么需要将dp设置成dp[20][2]这样大小的数组。(需要区分上一个数位是否取值6这两种情况)代码#include<iostream>#include<cstdio>#include<cstring>#include<st...原创 2019-03-25 12:04:55 · 105 阅读 · 0 评论