区间DP
文章平均质量分 51
hesorchen
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
uva10453动态规划+递归回溯
题目 给一个字符串,可以在任意位置增加任意字符,求最小增加多少个字符使字符串变成回文串,并输出一种方案。 求最小代价的题已经写过了,这题只需要状态转移的时候记录路径。(实际上好抽象,想不明白,不过瞎调调出来了… … 代码 #include <bits/stdc++.h> using namespace std; struct node { int L, R; char V; } opt[1010][1010]; char s[1010]; string v1[1010]; s原创 2021-04-21 21:28:07 · 179 阅读 · 0 评论 -
uva10739经典动态规划
题目 给出一个字符串,长度小于一千。你可以执行三种操作: 删除一个字符 增加一个字符 修改一个字符 问,最少执行多少次操作可以使原字符串变成回文字符串。 解题思路 dp[i][j]dp[i][j]dp[i][j]表示将区间[i,j][i,j][i,j]修改成回文串的最小花费。 由于dpdpdp的性质,当求dp[i][j]dp[i][j]dp[i][j]时,dp[i+1][j−1]dp[i+1][j-1]dp[i+1][j−1]、dp[i+1][j]dp[i+1][j]dp[i+1][j]、dp[i][原创 2021-04-20 20:22:35 · 401 阅读 · 0 评论 -
uva10617回文子序列数量动态规划
题目 给定一个字符串(len<=60),求回文子序列数量 解题思路 区间DP,dp[i][j]表示区间[i,n]的回文子序列数量。 初始化 memset(dp, 0, sizeof dp); for (int i = 1; i <= n; i++) dp[i][i] = 1; for (int i = 1; i < n; i++) dp[i][i + 1] = (s[i] == s[i + 1] ? 3 : 2); 状态转移: 如果s[l]==s[r]s[l]==s[r]原创 2021-04-21 16:17:49 · 195 阅读 · 0 评论 -
环状区间DP
合并石子 将经典的合并石子改成首位相连,即第一堆可以和最后一堆合并。 只需要预处理一下,将1到n-1堆石子放到n后面,重新构造出线性序列即可。 因为在环状序列中,最后的结果肯定是由最开始的某个[k,k+n-1]区间得到的。 代码:(找不到题目,不知正确性如何) /* * @Author: hesorchen * @Date: 2020-12-30 16:53:18 * @LastEditTime: 2021-01-26 16:27:50 * @Description: 栽种绝处的花 */ #inc原创 2021-01-26 16:29:41 · 295 阅读 · 0 评论 -
归并石子区间DP模板
题目链接 石子归并 区间DP模板题。 区间DP就是在区间上进行动态规划,通过合并小区间的最优解进而得出大区间上最优解的dp算法。 #include <bits/stdc++.h> using namespace std; int dp[110][110]; int a[110]; int sum[110]; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) cin &g原创 2021-01-21 21:14:17 · 1348 阅读 · 0 评论
分享