区间动态规划问题
区间动态规划是一类以区间 作为状态单位的动态规划模型,通常定义 表示区间 内某种性质的最优值或可行性结果。这类问题的核心特征在于:状态天然依赖左右端点,转移围绕区间边界关系或区间划分方式展开。与线性 DP 不同,它关注的不是当前位置如何由前一位置转移,而是 一个区间如何由更小的区间构成 。
从结构角度来看,区间 DP 的转移方式大致可以归纳为两类:端点拓展型 与 区间分治型 。以有效括号为例,合法的有效括号结构既包含嵌套结构,如 "(())" ,也包含并列结构,如 "()()" 。这两种合法的有效括号形态,恰好对应区间 DP 的两种典型转移方式。
端点拓展型强调左右端点之间的匹配关系,其典型形式是当区间两端满足某种条件时,可以由内部区间转移而来:
这种转移方式体现了 嵌套结构 的演变过程,大区间被视为在小区间的基础上由左右两端向外拓展而成。以有效括号为例,当两端字符配对时,整个区间的性质便完全继承自内部的子区间 。这种逻辑在回文类问题中同样适用,回文串的对称性 本质上就是一种层层嵌套的结构,两端字符的匹配是大区间能够延续内部区间回文特性的前提。这种模式将复杂区间拆解为一层层的嵌套形态,刻画了状态在空间上的 层次包含关系 。
另一类是区间分治型转移,其核心思想是通过枚举划分点,将区间拆分为左右两个并列子区间:
这种转移方式体现了 并列结构 的演变过程,大区间被视为由两个相邻子区间合并而成。以有效括号为例,枚举划分点 的本质是在寻找两个独立的有效括号序列的分界线,从而将大区间拆解为互不重叠的两个子区间。这种模式提供了另一种区间拓展的视角,不再关注 区间端点的延伸,而是更 侧重于小区间的拼接,深刻地揭示了复杂状态是如何由局部基础单元通过 逻辑整合 与 结构堆叠 演化而来的。
从另一个角度分析,我们所枚举的划分点 ,也可以看作是当前区间在 “最后一步操作” 或 “第一次操作” 中选定的关键位置。若将 视为一棵二叉树的根节点,那么子区间 与 便分别对应其左右子树,通过对子区间的持续递归分解,整个决策过程便形成一棵 二叉分治树 。许多经典的区间类问题,其核心都在于通过这种 选定中心并递归处理两侧 的方式,将复杂的整体结构转化为局部子结构的组合。
最长回文子序列
Problem Statement
给定一个字符串 s ,找到它的 最长回文子序列 的长度。子序列是从原字符串中删除部分字符后留下的序列,并 不改变剩余字符的顺序 。回文序列是正读和反读都相同的字符串。
例如,字符串 "bbbab" 的最长回文子序列是 "bbbb" ,长度为 4 。
Constraints
s仅由小写英文字母组成
Input
输入仅包含一行:
Output
输出一个整数,表示字符串 s 的最长回文子序列的长度。
Sample Input 1
bbbabSample Output 1
4Sample Input 2
cbbdSample Output 2
2题目要点解析
嵌套类型题
构造回文字符串
Problem Statement
给定一个字符串 s ,你可以在 任意位置插入字符 使得这个字符串变成 回文串 。请返回使字符串成为回文串所需要的 最少插入次数 。
注意,插入字符不会删除原有字符,你可以在字符串的头部、尾部或中间任意位置插入字符。
Constraints
s仅由小写英文字母组成
Input
输入仅包含一行:
Output
输出一个整数,表示将字符串 s 变成回文串所需的最少插入次数。
Sample Input 1
zzazzSample Output 1
0Sample Input 2
mbadmSample Output 2
2Sample Input 3
leetcodeSample Output 3
5题目要点解析
嵌套类型题
基于数组的博弈
Problem Statement
给定一个长度为 的整数数组 nums ,两位玩家轮流进行游戏,每一轮玩家从数组的 最左端或最右端 选择一个数字取走,取走后该数字从数组中移除。两位玩家都采用 最优策略 玩游戏。
玩家 先手,玩家 后手。游戏结束后,玩家 和玩家 分别拥有自己的数字总和。请你预测 先手玩家是否能够获胜(即先手玩家的总和大于或等于后手玩家的总和)。
如果先手玩家有获胜的策略,则返回 true ,否则返回 false 。
Constraints
Input
输入包含两行:
- 第一行包含一个整数 ,表示数组 的长度。
- 第二行包含 个整数,表示数组中的各个元素。
Output
输出一个布尔值( true 或 false ),表示在双方采用最优策略的情况下,先手玩家是否能够获胜。
Sample Input 1
31 5 2Sample Output 1
falseSample Input 2
41 5 233 7Sample Output 2
true题目要点解析
题目明示端点扩展
多边形三角剖分
Problem Statement
给你一个 凸多边形 的顶点数 和一个长度为 的整数数组 values ,其中 values[i] 表示第 个顶点的权值。
对于一个凸多边形的三角剖分,每次选取三个顶点组成一条三角形,并将该三角形一分为二直到整个多边形被划分成非重叠三角形。 定义三角剖分的 得分 为所有组成三角形的权值乘积之和,每个三角形的得分为三个顶点对应权值的乘积。
请返回这个凸多边形所有合法三角剖分中能够得到的 最低得分 。
Constraints
Input
输入包含两行:
- 第一行包含一个整数 ,表示顶点数(同时也是数组长度)。
- 第二行包含 个整数,表示数组 中每个顶点的权值。
Output
输出一个整数,表示所有合法三角剖分中能得到的最低得分。
Sample Input 1
31 2 3Sample Output 1
6Sample Input 2
43 7 4 5Sample Output 2
144题目要点解析
打气球最大得分
Problem Statement
有若干个气球排成一排,第 个气球的数字为 nums[i] 。当你戳破一个气球时,你将获得的金币数等于该气球左侧和右侧未被戳破气球的数字乘积再乘以该气球本身。如果某一侧已经没有未戳破的气球,则视为数字 。
换句话说,假设你依次戳破气球的顺序为 ,戳破第 个气球时获得的金币为:
其中 left 是第 个气球左边尚未被戳破的气球数字(若不存在则为 ),right 是第 个气球右边尚未被戳破的气球数字(若不存在则为 )。
请返回你能获得的 最大金币数 。
Constraints
Input
输入包含两行:
- 第一行包含一个整数 ,表示气球的数量。
- 第二行包含 个整数,表示数组 中每个气球的数字。
Output
输出一个整数,表示能获得的最大金币数。
Sample Input 1
43 1 5 8Sample Output 1
167Sample Input 2
21 5Sample Output 2
10题目要点解析
布尔运算表达式
Problem Statement
给定一个只包含字符 '0' 、'1' 和布尔运算符 '&' 、'|' 、'^' 的字符串 s 以及一个布尔值 result 。
你需要统计有多少种不同的方式,在运算表达式中加入括号,使得整个表达式的计算结果为 result 。
布尔运算规则如下:
'&'表示逻辑与,如果左右两边都为真(1)则结果为真,否则为假(0)。'|'表示逻辑或,只要左右任意一侧为真(1)则结果为真。'^'表示逻辑异或,当左右两侧不同时结果为真。
你需要返回使表达式结果为给定 result 的 不同括号组合的数量 。
Constraints
s由数字'0'、'1'与运算符'&'、'|'、'^'交替组成result为布尔值(true或false)
Input
输入包含两行:
- 第一行包含一个字符串
s,表示布尔运算表达式。 - 第二行包含一个整数 ,若为
1表示目标结果为true,若为0表示目标结果为false。
Output
输出一个整数,表示所有不同的括号插入方式中,能够让表达式计算结果等于 的方案数。
Sample Input 1
1^0|0|10Sample Output 1
2Sample Input 2
0&0&0&1^1|01Sample Output 2
10题目要点解析
嵌套类型题
最高加分二叉树
题目要点解析
有效括号字符串
Problem Statement
给定一个由 '[' 、']' 、'(' 、')' 组成的字符串,请问最少插入多少个括号才能使这个字符串的所有括号 左右配对 。
例如,当前字符串是 "([[])" ,那么插入一个 ']' 即可满足所有括号匹配的要求。
Constraints
- 字符串长度满足
- 字符串仅由上述 种括号字符组成
Input
输入仅包含一行:
Output
输出一个整数,表示使字符串所有括号配对所需插入的最少括号数。
Sample Input 1
([[])Sample Output 1
1Sample Input 2
([])[]Sample Output 2
0题目要点解析
奇怪的打印机器
Problem Statement
有台奇怪的打印机,它每次可以打印一串 相同字符 的序列,也就是说每次打印过程只能选择一个字符并将其连续地打印在一段区间上。
给你一个字符串 s ,奇怪的打印机最开始是空的,它可以在任意位置开始打印。每次打印它会选择一个区间并将同一个字符覆盖写入,在这个过程中会覆盖掉原来存在的字符。
请问这台打印机 打印出字符串 s 最少需要多少次打印操作 。
Constraints
s仅由小写英文字母组成
Input
输入仅包含一行:
Output
输出一个整数,表示奇怪的打印机打印出字符串 s 最少需要的操作次数。
Sample Input 1
abaSample Output 1
2Sample Input 2
aaabbbSample Output 2
2题目要点解析
尝试找到题目中的嵌套、并列关系
合唱班站队问题
Problem Statement
为了在晚会上有更好的演出效果,小 A 需要按照身高将合唱队的人排成一个队形。合唱队共有 个人,编号从 到 ,第 个人的身高为 ,且所有身高互不相同。
小 A 想知道有多少种 初始队形排列 能够最终生成他理想中的队形。生成过程如下:
-
首先,所有人按某种顺序站成一个初始队形;
-
然后从左到右依次将每个人插入新的队列中。
- 第一个人直接进入空队列;
- 对于后面的每个人,如果他比队列中最后一个人高,则将他插入队列的 最右边 ;
- 如果他比队列中最后一个人矮,则将他插入队列的 最左边 。
当所有人都插入结束后,就得到一个最终队形。如果最终队形恰好与给定的理想队形一致,则认为这个初始队形是合法的。
请你计算 所有能生成理想队形的初始队形数量 ,并输出答案对 取模后的结果。
Constraints
- 所有身高互不相同
Input
输入包含两行:
- 第一行包含一个整数 ,表示队伍中人的数量。
- 第二行包含 个整数,表示理想队形中每个人的身高。
Output
输出一个整数,表示满足条件的合法初始队形数量对 取模后的结果。
Sample Input
41701 1702 1703 1704Sample Output
8题目要点解析
题目明示端点扩展
移除盒子的得分
Problem Statement
给你一个由数字表示的盒子序列 boxes ,每个盒子的颜色由一个正整数表示。你可以执行以下操作:
每一次操作,你可以选择 连续的一组颜色相同的盒子(长度至少为 ),将这一组盒子取出并获得积分。取出长度为 的这一组盒子后,你将获得的积分为 。
取出之后,剩余的盒子会重新拼接成一个新的连续序列。你可以重复执行上述操作,直到所有盒子都被取出。
请返回你能获得的 最大积分数 。
Constraints
Input
输入包含两行:
- 第一行包含一个整数 ,表示盒子数量。
- 第二行包含 个整数,表示数组 中每个盒子的颜色。
Output
输出一个整数,表示能够获得的最大积分数。
Sample Input 1
91 3 2 2 2 3 4 3 1Sample Output 1
23Sample Input 2
31 1 1Sample Output 2
9题目要点解析
尝试找到题目中的嵌套、并列关系
不同的回文序列
Problem Statement
给定一个字符串 s ,请你统计其中 不同的非空回文子序列 的个数。
需要注意以下几点:
- 子序列定义为可以通过删除原字符串中任意位置的字符(可能不连续)得到的新字符串;
- 只统计 不同的回文子序列 ,重复的回文序列只计数一次;
- 最终结果可能很大,请返回答案对 取模的值。
Constraints
s仅由小写英文字母组成
Input
输入仅包含一行:
Output
输出一个整数,表示字符串 s 中不同的非空回文子序列的数量,对 取模后的结果。
Sample Input 1
bccbSample Output 1
6Sample Input 2
abcdabcdabcdabcdabcdabcdabcdabcddcbadcbadcbadcbadcbadcbadcbadcbaSample Output 2
104860361题目要点解析
嵌套类型题