
动态规划
little丶Sunshine
I believe that I can give you that what you want to!
展开
-
动态规划之考试策略
考试策略你有一场考试,考试时间为 120 分钟。考试有多道题目,你的作答顺序不受限制。对于第 i 道题目,你有三种不同的策略可以选择:直接跳过这道题目,不花费时间,本题得 0 分。只做这道题目一部分,花费 p[i] 分钟的时间,本题可以得到 part[i] 分。做完整道题目,花费 f[i] 分钟的时间,本题可以得到 full[i] 分。依次给定 4 个数组:p,part,f,full,请你计算出你最多能得到多少分。 样例 1: 输入: p=[20,50,100,5], part=[20,3原创 2021-01-18 16:44:57 · 333 阅读 · 0 评论 -
动态规划之不同的二叉查找树
不同的二叉查找树给出 n,问由 1…n 为节点组成的不同的二叉查找树有多少种? 样例 1: 输入: n = 3 输出: 5 解释: 有5种不同形态的二叉查找树 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1原创 2020-12-31 10:19:58 · 1201 阅读 · 0 评论 -
动态规划之不同的子序列
不同的子序列给定字符串 S 和 T, 计算 S 的所有子序列中有多少个 T.子序列字符串是原始字符串删除一些(或零个)字符之后得到的字符串, 并且要求剩下的字符的相对位置不能改变. (比如 “ACE” 是 ABCDE 的一个子序列, 而 “AEC” 不是)。注意事项:数组A的长度不超过5000,每个元素的大小不超过5000 样例 1: 输入: S = "rabbbit", T = "rabbit" 输出: 3 解释: 你可以删除 S 中的任意一个 'b', 所以一共有 3 种方原创 2020-12-30 16:12:36 · 237 阅读 · 0 评论 -
动态规划实例
动态规划:基本内容1. 具有最有子结构:即可划分多个同类型子问题求解2. 重叠子问题:即很多子问题都会被重复计算3. 确定状态,某一个子问题的求值结果4. 确定边界,可想象为矩形框边框初始值(如0行和0列)5. 确定状态转移方程,即当前规模扩大一步需执行的操作(类似于数列里的前一项和后一项的关系)程序编写步骤1. 确定DP缓存矩阵大小(建议0行0列不使用)2. 创建DP矩阵并初始化3. 初始化边界值(一般是第1行第1列)4. 以行列循环根据状态转换方程依次求子问题解5. 从DP矩阵中原创 2020-12-10 19:08:34 · 152 阅读 · 0 评论 -
动态规划之跳跃游戏
跳跃游戏给出一个非负整数数组,你最初定位在数组的第一个位置,数组中的每个元素代表你在那个位置可以跳跃的最大长度,判断你是否能到达数组的最后一个位置。 样例 1: 输入: [2,3,1,1,4] 输出: true 样例 2: 输入: [3,2,1,0,4] 输出: false解答:定义dp[i][j]为数组长度为i时,以第j个位置为最后一个跳点时是否能到达最后一个位置。则有状态转换方程:dp[i][j] = dp[j][j] && (j+A[j]原创 2020-12-15 13:32:20 · 417 阅读 · 2 评论 -
动态规划之不同的路径
不同的路径 有一个机器人的位于一个 m × n 个网格左上角.机器人每一时刻只能向下或者向右移 动一步。机器人试图达到网格的右下角。现在考虑网格中有障碍物,那样将会有多少 条不同的路径?网格中的障碍和空位置分别用 1 和 0 来表示。 样例 1: 输入: [[0]] 输出: 1 样例 2: 输入: [[0,0,0],[0,1,0],[0,0,0]] 输出: 2解答:定义dp[i][j]为从左上角到点[i-1][j-1]的路径数,因只可右或下行走故:dp[i原创 2020-12-15 11:44:24 · 195 阅读 · 0 评论 -
动态规划之数字三角形
数字三角形 给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上。 样例 1: 输入: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 输出: 11 解释: 从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11) 样例 2: 输入: [ [2], [3,2], [6,5,7], [4,4原创 2020-12-15 11:43:04 · 304 阅读 · 0 评论 -
动态规划之分割回文串
分割回文串 给定字符串 s, 需要将它分割成一些子串, 使得每个子串都是回文串.最少分割几次? 样例 1: 输入: "a" 输出: 0 解释: "a" 本身就是回文串, 无需分割 样例 2: 输入: "aab" 输出: 1 解释: 将 "aab" 分割一次, 得到 "aa" 和 "b", 它们都是回文串.解答:定义DP[i][j]为字符串s长度为i时,前j个字符使得每个子串都是回文串并且s的第j+1到第i个字符组成的子串也是回文的最小分割成次数.则DP[i][j原创 2020-12-15 11:42:01 · 499 阅读 · 1 评论 -
动态规划之单词拆分
单词拆分 给定字符串 s 和单词字典 dict,确定 s 是否可以分成一个或多个以空格分隔的子串, 并且这些子串都在字典中存在. 样例 1: 输入: "lintcode", ["lint", "code"] 输出: true 样例 2: 输入: "a", ["a"] 输出: true解答:定义dp[i][j]为s的前i个字符并且s的第j个字符到第i个字符划分为一个字串时是否可行则有状态转换方程dp[i][j] = dp[i][j] || {dp[j-1][j-1原创 2020-12-15 11:40:52 · 330 阅读 · 1 评论 -
动态规划之背包问题
背包问题 在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m, 每个物品的大小为A[i]. 样例 1: 输入: [3,4,8,5], backpack size=10 输出: 9 样例 2: 输入: [2,3,5,7], backpack size=12 输出: 12解答:定义:DP[i][j]表示有i个物品并且容量为j时,能装下的最大值。根据第i个物品仅有2种方案:1. 装入:此时为DP[i-1][j-A[i]] + A[i]2. 不装入:此时为D原创 2020-12-15 11:35:51 · 273 阅读 · 0 评论 -
动态规划之最长上升子序列
最长上升子序列 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 样例 1: 输入: [5,4,1,2,3] 输出: 3 解释: LIS 是 [1,2,3] 样例 2: 输入: [4,2,4,5,3,7] 输出: 4 解释: LIS 是 [2,4,5,7] 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的 子序列,这种子序列不一定是连续的或者唯一的。解答:定义DP[i] 为整数序列中第i个值为原创 2020-12-15 11:34:16 · 148 阅读 · 0 评论 -
动态规划之最长公共子序列
最长公共子序列 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度. 样例 1: 输入: "ABCD" and "EDCA" 输出: 1 解释: LCS 是 'A' 或 'D' 或 'C' 样例 2: 输入: "ABCD" and "EACB" 输出: 2 解释: LCS 是 "AC"解答:定义DP[i][j]为A的前i个字符和B的前j个字符的最大公共子序列长度·当末尾字符相等时,DP[i][j] = DP[i-1][j-1] + 1;·当原创 2020-12-15 11:32:39 · 95 阅读 · 0 评论 -
动态规划之交叉字符串
交叉字符串给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成. 样例 1: 输入: "aabcc" "dbbca" "aadbbcbcac" 输出: true 样例 2: 输入: "aabcc" "dbbca" "aadbbbaccc" 输出: false解答:定义DP[i][j] 为s1的前i个字符和s2的前j个字符是否匹配s3的前i+j个字符即:s3的第i+j个字符要么和s1的第i个字符匹配,要么和s2的第j个字符匹配,并且前i+原创 2020-12-15 11:29:58 · 231 阅读 · 0 评论