![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 75
动态规划算法
爱寂寞的时光
这个作者很懒,什么都没留下…
展开
-
字符串字典序
字符串字典序设字母集为∑\sum∑(通常为小写字母),∑∗\sum^*∑∗ 为表示包含所有有限长度的字符串的集合,该字符串是由字母表∑\sum∑中字符组成的,而字典序是定义在∑∗\sum^*∑∗上的一个偏序关系。设两个字符串为aaa与bbb,则两个字符串的大小关系为:令i=1i=1i=1。若i≤min{∣a∣,∣b∣}i \leq \min\{|a|,|b|\}i≤min{∣a∣,∣b∣}比较a[i]a[i]a[i]和b[i]b[i]b[i]之间的关系,若a[i]<b[i]a[i] <原创 2021-10-31 16:08:12 · 2268 阅读 · 0 评论 -
动态规划——Rerooting DP
动态规划——Rerooting DPRerooting DP 方法是解决一类树上DP问题的一般解决方法,与树形DP不同的是,树形DP只根据节点的儿子节点计算得到父节点的答案,而在Rerooting DP法中,将每个节点都看成是该颗树的根节点,根节点在树中转移,因此叫Rerooting DP方法。原文地址(日文):Rerooting DPRerooting DP包括两次DFS:计算子树答案(树形DP)。根节点转移。本文将以ABC222 F为例子,讲解Rerooting DP。子树答案定义原创 2021-10-13 20:45:32 · 254 阅读 · 0 评论 -
动态规划——不重复子序列DP法
动态规划——不重复子序列DP法考虑一个基本模型:给定一个字符串SSS,请问SSS中有多少个不重复的子序列。这里的子序列指,删掉SSS中某些字符,剩下的字符按照原有的顺序拼成的字符串。容易想到一个基本的DP解法:设dpidp_idpi为以SiS_iSi结尾(必选)的S[1,i]S[1,i]S[1,i]中的子序列的数量。特别的,设dp0=0dp_0=0dp0=0,对应一个空字符串。那么有如下转移方程:dpi=∑j=0i−1dpjdp_i = \sum_{j = 0}^{i-1}dp_jd原创 2021-08-14 22:36:53 · 436 阅读 · 0 评论 -
动态规划——悬线法
动态规划——悬线法悬线法用来求解最大子矩形问题。极大悬线:以某个点为悬线的下端点,一直往上延伸的最大可行宽度为111的线段。左右扩展:将极大悬线向左向右进行最大化扩展。因此定义变量h[x]h[x]h[x],l[x]l[x]l[x]和r[x]r[x]r[x],分别表示极大悬线的高度,左扩展的边界,右扩展的边界。例题P1169 棋盘制作#include <bits/stdc++.h>#define FR freopen("in.txt", "r", stdin)using原创 2021-07-20 21:50:22 · 213 阅读 · 0 评论 -
概率论详解
概率&期望DP概率DP期望DP原理:全概率公式。对某个值的期望就是值乘以概率的和。P1850#include <bits/stdc++.h>using namespace std;#define FR freopen("in.txt", "r", stdin)#define FW freopen("out.txt", "w", stdout)typedef long long ll;#define INF 500000int n, m, v, e;原创 2021-04-16 00:25:49 · 387 阅读 · 0 评论 -
质数生成集
质数生成集求第kkk个丑数。丑数NNN的质因数只有2,3,52,3,52,3,5。我们知道任何一个丑数NNN,都是小于NNN的某一个丑数乘以2,3,52,3,52,3,5生成的。因此,我们得到三个有序序列:1∗2,2∗2,3∗2,4∗2,5∗2,…1∗3,2∗3,3∗3,4∗3,5∗3,…1∗5,2∗5,3∗5,4∗5,5∗5,…1*2,2*2,3*2,4*2,5*2,\ldots \\1*3,2*3,3*3,4*3,5*3,\ldots \\1*5,2*5,3*5,4*5,5*5,\ldot原创 2021-04-11 23:41:42 · 179 阅读 · 0 评论 -
数位DP
数位DP数位DP通常适用于以下问题:给定一个区间[l,r][l,r][l,r],给定一个条件函数C(n)C(n)C(n),若数nnn满足条件CCC,则C(n)C(n)C(n)的值为111,否则为000。求在这个区间满足条件CCC的数的个数有几个?数位DP,顾名思义,就是在数的个位,十分位,百分位,……上做DP。我们定义:dp(pos,pre,limit)dp(pos,pre,limit)dp(pos,pre,limit)表示从低位开始算起,计算第pospospos位的值符合条件的数的数量。其原创 2021-04-06 21:20:35 · 547 阅读 · 1 评论 -
缩点DP
缩点DP对于任何一个DP的过程,我们都可以把他看作是对DAG图遍历一次拓扑排序,针对于一条路径x→…→yx \to \ldots \to yx→…→y,中间的状态转移都是状态继承,我们就直接可以把中间的点去掉,把这个路径压缩为x→yx \to yx→y,压缩之后,不改变答案的结果,即中间的点对结果没有任何帮助,仅仅是一个传递状态的作用,我们就可以压掉这些点。在DP中叫做路径压缩,也叫缩点。此方法针对于DP状态转移十分稀疏(大多数都是状态继承),并且节点数很多的点。缩点的方法有很多,例如动态缩点、数论缩原创 2021-03-04 12:28:28 · 152 阅读 · 1 评论 -
状态压缩DP
状态压缩DP状态压缩DP通常用一段二进制序列表示一个状态,状态压缩DP有个非常显著的特点,问题一般都是最优化问题或者是计数问题,数据范围一般很小n≤20n \leq 20n≤20。例题P1433 吃奶酪这是典型的旅行商问题,OI届未找到多项式时间的解法,因此只能暴力求解。定义状态dp[S][i]dp[S][i]dp[S][i],为已经吃到的奶酪集合为SSS,现在在第iii个奶酪的位置上,动态规划转移方程为:dp[S][i]=mink∈S−{i}(dp[S][i],dp[S−{i}][j]+di原创 2021-02-22 22:12:07 · 111 阅读 · 0 评论 -
区间&环形动态规划
区间&环形动态规划区间动态规划主要思路:定义数组dp[i][j]dp[i][j]dp[i][j]为子区间[i,j][i,j][i,j]的最优解,然后建立动态规划方程,枚举的变量一般为距离,也就是j−i+1j-i+1j−i+1。例题待补充。环形动态规划主要思路:定义数组dp[i][j]dp[i][j]dp[i][j]为子区间[i,j][i,j][i,j]的最优解,然后建立动态规划方程,枚举的变量一般为距离,也就是j−i+1j-i+1j−i+1。与区间动态规划不同的是,通常将一个环剪开变成一个原创 2021-02-20 15:07:35 · 533 阅读 · 0 评论 -
最长公共子序列
最长公共子序列最长公共子序列是一个典型的二维线性动态规划问题,给定两个长度相同的序列,求这两个序列中的最长公共子序列。例如:序列1,3,5,4,91,3,5,4,91,3,5,4,9和5,7,4,9,35,7,4,9,35,7,4,9,3的最长公共子序列为5,4,95,4,95,4,9。动态规划定义状态为dp[i][j]dp[i][j]dp[i][j]为子序列aaa到下标iii为止,子序列bbb到下标jjj为止的最长公共子序列的长度。因此我们有如下的动态规划方程:如果a[i]=b[j]a[i]原创 2021-02-17 13:29:06 · 64 阅读 · 0 评论 -
背包十论
0/1背包、完全背包0/1背包每个物品都有自己的价值和体积,问如何在固定的背包容积下,并且每个物品只能拿一次,装下的物品的价值最大?动态规划方程:dp[i][j]=max(dp[i−1][j],dp[i−1][j−ci]+wi)dp[i][j] = \max(dp[i-1][j],dp[i-1][j-c_{i}] +w_{i})dp[i][j]=max(dp[i−1][j],dp[i−1][j−ci]+wi)因为是访问上一层,因此我们要从后往前递推数组,保证获取到的值都是上一层的。#i原创 2021-02-16 21:56:03 · 258 阅读 · 0 评论 -
最大上升子序列
最大上升子序列递归int LIS(int arr[],int idx,int upper){ if(idx == 0) { if(arr[0] < upper) return 1; else return 0; } // 初始化为上一个idx上界为upper int ans = LIS(arr,idx-1,upper); if(arr[idx] < upper) // 如果可以,调整上界原创 2021-02-16 17:14:13 · 262 阅读 · 0 评论