线性 dp
LIS,LCS...,数字三角形,最短编辑距离,
wdt_
即使上线也匆忙,新版本,愁断肠,orz...
展开
-
【线性 dp】B012_LC_乘积为正数的最长子数组长度(分类讨论负数和正数)
给你一个整数数组 nums ,请你求出乘积为正数的最长子数组的长度。一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。请你返回乘积为正数的最长子数组长度。示例 1:输入:nums = [1,-2,-3,4]输出:4解释:数组本身乘积就是正数,值为 24 。示例 2:输入:nums = [0,1,-2,-3,-4]输出:3解释:最长乘积为正数的子数组为 [1,-2,-3] ,乘积为 6 。注意,我们不能把 0 也包括到子数组中,因为这样乘积为 0 ,不是正数提示:1原创 2020-08-31 00:05:33 · 213 阅读 · 0 评论 -
【线性 dp】B011_LQ_密码脱落(读懂题意=LCS变形)
X星球的考古学家发现了一批古代留下来的密码。这些密码是由A、B、C、D 四种植物的种子串成的序列。仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。你的任务是:给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子输入输入一行,表示现在看到的密码串(长度不大于1000)输出要求输出一个正整数,表示至少脱落了多少个种子样例输入ABCBA样例输出0输入ABDCDC原创 2020-08-23 16:39:59 · 153 阅读 · 0 评论 -
【线性 dp】B010_LQ_修改字符使T成为S的子序列(在s中找第一个等于t[j]的字符进行替换或否)
题目给定两个字符串S和T,保证S的长度不小于T的长度,问至少修改S的多少个字符,可以令T成为S的子序列。输入描述:第一行是字符串S,第二行是字符串T。保证S的长度不小于T的长度,S的长度范围在10~1000 之间。输出描述:答案,一个非负整数。输入样例:XBBBBBACACC输出样例:2方法一:dp定义状态:f[i][j] 表示修改范围为 s 的前 i 个字符,且使得 t 的前 j 个字符成为 s 的子序列的最少操作次数思考初始化:f[i] =思考状态转移方程原创 2020-08-20 20:54:54 · 953 阅读 · 0 评论 -
【线性 dp】B000_LC_回文子串的个数(枚举 / 真假 dp / 中心向两边延伸)
一、题目描述Given a string, your task is to count how many palindromic substrings in this string.The substrings with different start indexes or end indexes are counted as different substrings even they co...原创 2020-03-24 15:42:34 · 235 阅读 · 0 评论 -
【线性 dp】A009_LC_使数组严格递增(枚举 操作0次 & 操作 > 0 次的状态)
一、Problem给你两个整数数组 arr1 和 arr2,返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。每一步「操作」中,你可以分别从 arr1 和 arr2 中各选出一个索引,分别为 i 和 j,0 <= i < arr1.length 和 0 <= j < arr2.length,然后进行赋值运算 arr1[i] = arr2[j]。如果无法让 arr1 严格递增,请返回 -1示例 1:输入:arr1 = [1,5,3,6,7], arr2 = [1原创 2020-08-01 21:08:53 · 127 阅读 · 0 评论 -
【线性 dp】B016_LC_最长等差数列(unordered_map + dp)
一、Problem给定一个整数数组 A,返回 A 中最长等差子序列的长度。回想一下,A 的子序列是列表 A[i_1], A[i_2], …, A[i_k] 其中 0 <= i_1 < i_2 < … < i_k <= A.length - 1。并且如果 B[i+1] - B[i]( 0 <= i < B.length - 1) 的值都相同,那么序列 B 是等差的。输入:[20,1,15,3,10,5,8]输出:4解释:最长的等差子序列是 [20,15,1原创 2020-07-04 11:51:22 · 223 阅读 · 0 评论 -
【线性 dp】B008_LC_环绕字符串中唯一的子字符串(统计以 i 结尾的最长连续字符串的长度(暴力 / 优化)
一、Problem把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…".现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 s 中 p 的不同的非空子串的数目。示例 1:输入: "a"输出: 1解释: 字符串 S 中只有一个"原创 2020-07-30 23:03:05 · 207 阅读 · 0 评论 -
【线性 dp】B000_LC_最长上升子序列(dp / 二分优化)
一、题目描述Given an unsorted array of integers, find the length of longest increasing subsequence.Input: [10,9,2,5,3,7,101,18]Output: 4 Explanation: The longest increasing subsequence is [2,3,7,101],...原创 2020-03-04 23:39:23 · 202 阅读 · 0 评论 -
【线性 dp】A007_LC_自由之路(记忆化 / dp 模拟)
一、Problem视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。旋转 rin原创 2020-07-30 10:49:51 · 214 阅读 · 0 评论 -
【线性 dp】A006_LC_马戏团人塔 & 堆箱子 & 俄罗斯套娃信封问题(LIS 变形 / 二分优化)
一、Problem有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人。输入:height = [65,70,56,75,60,68] weight = [100,150,90,190,95,110]输出:6解释:从上往下数,叠罗汉最多能叠 6 层:(56,90), (60,95), (65,100), (68,110), (70,150), (75,190)提原创 2020-07-28 21:18:18 · 218 阅读 · 0 评论 -
【线性 dp】A006_LC_青蛙过河(记忆化 / map存储跳跃步数)
一、Problem一只青蛙想要过河。 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有)。 青蛙可以跳上石头,但是不可以跳入水中。给定石子的位置列表(用单元格序号升序表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一个石子上)。 开始时, 青蛙默认已站在第一个石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格1跳至单元格2)。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1个单位。 另请注意,青蛙只原创 2020-07-28 10:01:07 · 208 阅读 · 0 评论 -
【线性 dp】A005_LC_不同的子序列(记忆化 / dp 分类讨论)
一、Problem给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。题目数据保证答案符合 32 位带符号整数范围。示例 1:输入:S = "rabbbit", T = "rabbit"输出:3解释:如下图所示, 有 3 种可以从 S 中得到 "rabbit" 的方案。(上箭头符号 ^ 表示选取的字母)rabbbit^^^^ ^^rabbbit^^ ^^^^rabbbit^^^ ^^^二、Solution方法一:记忆化思路问题本质是抽出 s原创 2020-07-27 12:05:02 · 186 阅读 · 0 评论 -
【线性 dp】B004_LC_删除与获得点数(打家劫舍思想 / 空间压缩)
一、Problem给定一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例 1:输入: nums = [3, 4, 2]输出: 6解释: 删除 4 来获得 4 个点数,因此 3 也被删除。之后,删除 2 来获得 2 个点数。总共获得 6 个点数。示例 2输入原创 2020-07-25 18:47:44 · 182 阅读 · 0 评论 -
【线性 dp】A000_编辑距离 & 两个字符串的最小ASCII删除和(暴搜 / 记忆化 / dp)
一、题目描述Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.You have the following 3 operations permitted on a word:Insert a characterDelete a ...原创 2020-04-06 15:59:21 · 315 阅读 · 3 评论 -
【线性 dp】B022_LC_最大整除子集(求最大子序列长度 + 记录路径)
一、Problem给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0。如果有多个目标子集,返回其中任何一个均可。示例 1:输入: [1,2,3]输出: [1,2] (当然, [1,3] 也正确)示例 2:输入: [1,2,4,8]输出: [1,2,4,8]二、Solution方法一:dp这不单单要知道序列的长度,也要知道该长度所代表的具体元素,故需要记录 dp 时的路径定义状原创 2020-07-24 17:12:02 · 200 阅读 · 0 评论 -
【线性 dp】A021_LC_解码方法 I~II(分别讨论 s[i-1])
一、Problem一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。示例 2:输入: "226"输出: 3解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。二、Solution方法一:原创 2020-07-24 12:21:17 · 309 阅读 · 0 评论 -
【线性 dp】A020_LC_交错字符串(类比网格动归)
一、Problem给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"输出: true输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"输出: false二、Solution方法一:复杂度分析时间复杂度:O()O()O(),空间复杂度:O()O()O(),方法二:复杂度分析时间复杂原创 2020-07-18 16:10:23 · 188 阅读 · 0 评论 -
【线性 dp】B019_LC_最佳买卖股票时机含冷冻期(分类讨论)
一、Problem给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。输入: [1,2,3,0,2]输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]二、Solution方法一:dp对于第 iii 天,我们会有三种状态:原创 2020-07-10 15:27:01 · 148 阅读 · 0 评论 -
【线性 dp】B018_LC_恢复空格(分类讨论)
一、Problem哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意:本题相对原原创 2020-07-09 23:32:18 · 166 阅读 · 0 评论 -
【线性 dp】B017_LC_将字符串翻转到单调递增(分类讨论)
一、Problem如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是单调递增的。我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 S,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。返回使 S 单调递增的最小翻转次数。示例 1:输入:"00110"输出:1解释:我们翻转最后一位得到 00111.示例 2:输入:"010110"输出:2解释:我们翻转得到 0原创 2020-07-09 22:08:02 · 164 阅读 · 0 评论 -
【线性 dp】A016_LC_通配符匹配(分类讨论)
一、ProblemGiven an input string (s) and a pattern §, implement wildcard pattern matching with support for ‘?’ and ‘*’.'?' Matches any single character.'*' Matches any sequence of characters (including the empty sequence).The matching should cover the原创 2020-07-05 23:23:02 · 199 阅读 · 0 评论 -
【线性 dp】A015_LC_最长有效括号(栈 + dp / 空间压缩)
一、ProblemGiven a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.Input: ")()())"Output: 4Explanation: The longest valid parentheses substring is "()()"二、Solution这题最朴素的做法是枚举每原创 2020-07-04 20:47:13 · 393 阅读 · 0 评论 -
【线性 dp】B014_LC_最长字符串链(暴力 / map 优化)
一、Problem给出一个单词列表,其中每个单词都由小写英文字母组成。如果我们可以在 word1 的任何地方添加一个字母使其变成 word2,那么我们认为 word1 是 word2 的前身。例如,“abc” 是 “abac” 的前身。词链是单词 [word_1, word_2, …, word_k] 组成的序列,k >= 1,其中 word_1 是 word_2 的前身,word_2 是 word_3 的前身,依此类推。从给定单词列表 words 中选择单词组成词链,返回词链的最长可能长度。原创 2020-06-27 15:00:44 · 303 阅读 · 0 评论 -
【线性 dp】B013_LC_不相交的线(LMS 变形)
一、Problem我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。现在,我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且我们绘制的直线不与任何其他连线(非水平线)相交。以这种方法绘制线条,并返回我们可以绘制的最大连线数。输入:A = [1,4,2], B = [1,2,4]输出:2解释:我们可以画出两条不交叉的线,如上图所示。我们无法画出第三条不相交的直线,因为从 A[1]=4 到 B[2]=4 的直线将与从 A[2]=2 到原创 2020-06-26 12:12:23 · 267 阅读 · 0 评论 -
【线性 dp】B012_LC_最长公共子序列(递归 / 记忆化搜索 / dp)
一、题目描述Given two strings text1 and text2, return the length of their longest common subsequence.A subsequence of a string is a new string generated from the original string with some characters(can...原创 2020-03-05 11:59:00 · 208 阅读 · 0 评论 -
【线性 dp】B012_LC_K 次串联后最大子数组之和(最大前后缀和 + 最大子数组 + 分类讨论)
一、Problem给你一个整数数组 arr 和一个整数 k。首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次。举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。然后,请你返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0,在这种情况下它的总和也是 0。由于 结果可能会很大,所以需要 模(mod) 10^9 + 7 后再返回。输入:arr = [1,-2,1], k = 5输出:2提示:1 <原创 2020-06-22 18:07:18 · 210 阅读 · 0 评论 -
【线性 dp】B011_LC_删除一次得到子数组最大和(分类讨论 / 空间压缩)
一、Problem给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中最大的。注意,删除一个元素后,子数组 不能为空。输入:arr = [1,-2,0,3]输出:4解释:我们可以选出 [1, -2, 0, 3],然后删掉 -2,这样得到 [1, 0, 3],和最大。原创 2020-06-22 10:34:52 · 1024 阅读 · 0 评论 -
【线性 dp】A010_LC_正则表达式匹配(分类讨论)
一、Problem给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。输入:s = "aab"原创 2020-06-20 22:42:43 · 213 阅读 · 0 评论 -
【线性 dp】A009_LC_规划兼职工作(dp / 二分优化)
一、ProblemWe have n jobs, where every job is scheduled to be done from startTime[i] to endTime[i], obtaining a profit of profit[i].You’re given the startTime , endTime and profit arrays, you need to output the maximum profit you can take such that there a原创 2020-06-18 22:28:50 · 219 阅读 · 0 评论 -
【线性 dp】B008_LC_最佳观光组合(dp / 空间优化)
一、ProblemGiven an array A of positive integers, A[i] represents the value of the i-th sightseeing spot, and two sightseeing spots i and j have distance j - i between them.The score of a pair (i < j) of sightseeing spots is (A[i] + A[j] + i - j) : the原创 2020-06-17 20:58:13 · 196 阅读 · 0 评论 -
【线性 dp】B007_NK_最长等差数列问题(暴力 dp / 预处理差)
一、Problem给定一个未排序数组,找出其中最长的等差数列(无需保证数字顺序)。输入描述:第一行N表示数组中元素个数(N < 10,000,000)第二行是数组的元素,用空格分割输出描述:等差序列长度示例1输入51 4 2 5 3输出5二、Solution这题居然能用 n2n^2n2 的复杂度算法过掉 10610^6106 的数据,我也是服了…方法一:dp定义状态:f[i][d]f[i][d]f[i][d] 表示在数列的第 iii 个位置时,公差为 ddd 的原创 2020-06-17 19:57:44 · 246 阅读 · 0 评论 -
【线性 dp】B006_LC_可被三整除的最大和(三种余数)
一、ProblemGiven an array nums of integers, we need to find the maximum possible sum of elements of the array such that it is divisible by three.Input: nums = [3,6,5,1,8]Output: 18Explanation: Pick numbers 3, 6, 1 and 8 their sum is 18 (maximum sum divis原创 2020-06-13 16:10:30 · 175 阅读 · 0 评论 -
【线性 dp】B005_LC_把数字翻译成字符串(抽象)
一、Problem给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"提示:0 <= num < 231二、Solution方法一:dp定义状态:f[i原创 2020-06-09 22:33:11 · 116 阅读 · 0 评论 -
【线性 dp】A004_LC_给房子涂色 III(三维记忆化 / dp)
一、ProblemThere is a row of m houses in a small city, each house must be painted with one of the n colors (labeled from 1 to n), some houses that has been painted last summer should not be painted again.A neighborhood is a maximal group of continuous hous原创 2020-06-08 23:00:37 · 227 阅读 · 0 评论 -
【划分 dp】B000_LC_整数划分 & 剪绳子(dp / 数学推导 + 贪心)
一、题目描述Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.Input: 10Output: 36Expl...原创 2020-06-02 17:11:58 · 212 阅读 · 0 评论 -
【线性 dp】B003_LC_最长湍流子数组(读题 dp / 双指针)
一、ProblemA subarray A[i], A[i+1], …, A[j] of A is said to be turbulent if and only if:For i <= k < j, A[k] > A[k+1] when k is odd, and A[k] < A[k+1] when k is even;OR, for i <= k < j, A[k] > A[k+1] when k is even, and A[k] < A[k原创 2020-05-26 20:51:48 · 276 阅读 · 0 评论 -
【线性 dp】A002_LC_跳跃游戏 V(记忆化搜索 / 排序 + dp + 疑惑)
一、ProblemGiven an array of integers arr and an integer d. In one step you can jump from index i to index:i + x where: i + x < arr.length and 0 < x <= d.i - x where: i - x >= 0 and 0 < x <= d.In addition, you can only jump from index i原创 2020-05-19 20:07:16 · 247 阅读 · 0 评论 -
【线性 dp】B002_最大和的子序列(dp / 暴力)
一、题目描述Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.Input: [-2,1,-3,4,-1,2,1,-5,4],Output: 6Explanation:...原创 2020-03-06 17:16:34 · 194 阅读 · 0 评论 -
【线性 dp】B001_最大正方形(木桶原理)
一、ProblemGiven a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.Input: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0Output: 4二、Solution方法一:木桶原理这次不得不参考别人的做法了,是在想不到…定义状态:dp[i][j]dp[i][j]dp[i][原创 2020-05-09 21:16:05 · 236 阅读 · 0 评论 -
【线性 dp】C002_最大子序和(暴力枚举 / dp)
一、题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大为 6。二、分析思路一【1】算法: 暴力循环遍历解法:这是很容易想到了一种方法,从左到右以每 1 个数作为起点,每次加上随后的一个数后比较...原创 2019-08-10 22:29:40 · 188 阅读 · 0 评论