![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
文章平均质量分 70
TSOI_Vergil
这个作者很懒,什么都没留下…
展开
-
usaco 2.3.2 nocows
这道题一开始想的是递归构造然后算一下,后来感觉不可行,考虑DP,然而由于自己设计的状态不行,转移不可行。被逼无奈看了题解。用F[i][j]表示用i个结点,构造出深度最多为j的树的方案数,那么有F[i][j]=Σ(F[k][j-1]*F[i-1-k][j-1]),因为这是一个二叉树,那么我们可以通过根与两棵子树的状态得到大树的状态,这个是在二叉树中的常见转移。自己还是太弱了啊啊啊..../*原创 2016-09-13 19:28:12 · 285 阅读 · 0 评论 -
BZOJ 1864
首先对于这道题,首先我们可以想到,一个节点染成红色或蓝色是没有任何区别的,因为我们可以将树中的所有红色和蓝色对调,这样我们就可以得到一种和原来完全相同的方案,这样我们可以设计状态dp[i][0]和dp[i][1],分别表示以i为根节点的子树可以涂绿的最大值,其中1表示i涂成了绿色,0表示没有涂成绿色,令L[i]和R[i]分别表示i的左节点和右节点,容易得到转移方程:dp[i][0]=max(dp[原创 2016-09-29 18:03:49 · 299 阅读 · 0 评论 -
NOIP 2014 飞扬的小鸟
一个DP题,我们考虑一个状态,F[i][j]表示到i这个横坐标,当前高度为j所需的最少点击次数。那么我们有F[i][j]的方程为F[i][j]=min{F[i-1][j+y[i]],F[i-1][j-k*x[i]]+k},这样做的复杂度是O(n*m*k)的,我们考虑优化,这个状态是不可能再优化的了,那我们考虑优化转移,我们发现其实k的枚举是有很多重复的,我们可以将转移方程改写为F[i][j]=mi原创 2016-11-07 17:47:26 · 488 阅读 · 0 评论 -
树形DP之王 balabalabala
题目:给你一棵树,要你求最大匹配和最大匹配的方案数。最大匹配就是选尽量多的边,使这些边的端点不重合。方案数要对1e9+7取模。n这道题大概是我见过的树形DP中最难的,我称之为树P之王,首先,对于最大匹配,我们可以将边上放到点,即dp[i][0]表示不选i下面所连的边,dp[i][1]表示选i下面的边,那么我们可以知道dp[i][0]=西格玛max(dp[son[i]][1],dp[son[i]原创 2016-10-27 21:51:12 · 296 阅读 · 0 评论 -
洛谷 2258
这道题我们一看数据范围第一感觉是状压DP,将每一列的选与不选看成是一个二进制数,但是这道题我们考虑如果知道了每一列选与不选,我们每一行的差值,现在问题就变成了在n列中选r行使其形成的矩阵值最小。我们可以考虑DP,F[i][j][k]表示在i这个状态,选了j行,最后一行选的是第k行,形成矩阵的最小值,转移模仿LIS的转移,我们可以预处理出合法的状态,然后再处理出在这个状态下任意两行相邻后的值,以及这原创 2016-11-08 21:45:27 · 441 阅读 · 0 评论 -
TYVJ 1313
这题一看就是DP,不过我一开始想的状态是f[i][0/1],表示到第i个位置,第i个灯亮或不亮所需要的最小值,后来看别人写的都只有一维,即f[i]表示到第i个位置的最小值,仔细想想这两种状态是有所区别的,第一种状态的转移比较显然,通过优化后也能AC,这里主要讲一下第二种转移,f[i]=min(f[j])+a[i],其中j的范围是[i-m,i-1],为什么这样转移是对的呢?因为我们相当于默认了第i个原创 2016-10-18 19:05:05 · 346 阅读 · 0 评论 -
盒子与小球系列题解
盒子与小球,NOI网站题库的一系列题,可在NOI题库中提交。原创 2016-11-09 17:56:26 · 3621 阅读 · 1 评论 -
洛谷 1136
这道题的转化比较巧妙,我们知道每个字符都只有两种可能,即换与不换,那么我们知道j与j、z与z之间的交换是没有意义的,那么我们可以知道如果这个字符换了,那它一定是变成了与它之前不同的那个,于是我们可以设计状态f[i][j][k],表示前i个字符,j个‘j’变成了'z',k个‘z’变成‘j’,能得到的最多jz的数量,只有当j==k时我们可以更新答案,那么如何转移呢,我们可以将每个长度为i的串看成是一个原创 2016-10-28 21:08:08 · 328 阅读 · 0 评论 -
LICS
LICS,即最长上升公共子序列,我们都知道LIS和LCS的n2求法,那么将它们两个组合到一起又怎么样呢?首先我们设计状态,f[i][j]表示A考虑到i,B考虑到j,能得到的LICS的最长长度,那么对于a[i]!=b[j]的情况,有f[i][j]=f[i-1][j],这里我们规定是B与A匹配,也就是说当b[j]无法与a[i]相匹配时,我们就看看b[j]能不能和i以前的位置匹配,那对于a[i]=b[j原创 2016-10-29 07:35:08 · 749 阅读 · 0 评论 -
洛谷 1417
这道题应该可以看出是背包问题,转移方程为f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+a[i]-j*b[i]),但是如果我们只是这样转移的话会出现问题,这道题与01背包的不同在于每个物品的价值与它放入的顺序有关,因为它的价值是a[i]-j*b[i],怎么办呢?我们考虑一下是否已经存在一种顺序使按照这种顺序装的话价值最大呢?类比与国王游戏那道题,我们考虑一下,假设当前1号原创 2016-10-29 19:47:23 · 323 阅读 · 0 评论 -
Domino 状压DP
Domino (domino.pas)某天,wangjy和DaoThree在玩多米诺游戏。。。DaoThree提出一个令wangjy抓头的问题:有一个m行n列的矩阵,用1*2的骨牌(可横放或竖放)完全覆盖,骨牌不能重叠,有多少种不同的覆盖的方法?请你帮助wangjy解决:)wangjy不想看到长串的高精度数,你只需要求出覆盖方法总数mod p 的值即可Input(domin原创 2016-10-15 07:57:55 · 637 阅读 · 0 评论 -
洛谷 1373
最近要补一补自己的DP了,感觉自己DP好弱...这道题首先我们比较容易设计出转移方程,令f[i][j][k1][k2][opt]表示opt取完了i,j格的魔液,此时小A有k1个,uim有k2个的方案数。那么我们容易写出转移方程,可以用递推的形式来转移,由于每个点都可以是起点,那么初始状态就需要把所有的f[i][j][a[i][j]][0][0]赋值为1,这样做复杂度为n*m*k*k,过不了所有点。原创 2016-09-28 20:48:18 · 296 阅读 · 0 评论 -
usaco 3.2.3 stringsobits
自己亲手写的一道题,感觉对思维还是很有帮助的,存一下代码。/* ID:15230521 PROB:kimbits LANG:C++*/#include#include #include#includeusing namespace std;int N,L;long long f[40][40],I;int ans[40];void dfs(int x,int y,l原创 2016-09-19 20:23:57 · 248 阅读 · 0 评论 -
洛谷 1489
这道题竟然是一个背包!我之前设计了一个四维状态,f[i][j][k][0/1]表示在前i个人中选j个人,在i个人里划分的这两个集合差的绝对值,0表示少,1表示多,然后果断MLE,A了6个点。仔细再想想为什么这个状态这么复杂,是因为设计的不好,导致想要转移时必须要有足够的信息,因此我们考虑令一种设计方法,令f[i][j][k]表示选前i个人选j个血量能否达到k,那么转移方程为f[i][j][k]=f原创 2016-10-09 18:57:23 · 280 阅读 · 0 评论 -
洛谷 2458
浓浓的树P气息,令dp[i][0/1/2],0表示i点有人,1表示i点无人但存在一个i的儿子有人,2表示i和i的儿子都没人,但对于所有i的儿子,都存在一个它的儿子有人,那么我们可以得出转移方程,dp[i][0]=max{dp[son[i]][0],dp[son[i]][1],dp[son[i]][2]}+cost[i],dp[i][1]=min{dp[son[i]][1]}+sum{min(dp[原创 2016-10-21 11:37:19 · 328 阅读 · 0 评论 -
洛谷 1651
这道题是一道考验如何记录状态的DP题,我们令f[i][j]表示考虑了前i个积木,两座塔的差值为j的那个低一些的塔的最高高度,对于每一块积木,我们都有三种选法,即放入第一个塔,放入第二个塔,不使用,这样状态的转移就很显然了,至于为什么是f[i][j]是表示最高高度,我们考虑如果在1到i中存在多种方法时两塔的差值为j,那么我们一定是选择低塔最高的,因为题目要求要最高的高度相等的两塔,如果在后面能够将这原创 2016-10-21 14:34:40 · 297 阅读 · 0 评论 -
洛谷 1650
我们考虑其实齐王的出马顺序对最终的答案是没有影响的,因为我们确定的是田忌的马与齐王的马的最佳匹配,考虑到这一点后,我们不妨假设齐王出马是按速度值从大到小出,那么我们有2种选择,一种是用当前最快的马赢或打平,一种是用当前最慢的马输掉,留着更快的马赢得比赛。那假设我们将田忌的马也按照速度值从大到小排序,那我们选的马一定是当前速度最快的或者最慢的,这样我们可以设计一个DP,F[i][j]表示齐王出了i匹原创 2016-11-03 14:20:43 · 414 阅读 · 0 评论 -
洛谷 2331
这道题还是一道很不错的DP题,我们考虑当m=1时,是不是相当与一个序列操作,我们可以设计一个状态f[i][j],表示考虑到第i行,选了j个矩形的最大值,那么我们考虑转移,当前行只有2种转移的方式,一种是什么也不做,即不选这个格子,还有一种是让这个格子和上面的格子形成一个矩形。那么对于m=2的情况,我们可以再加1维,f[i][j][k]表示第1列考虑到i,第2列考虑到j,选了k个矩形的最大值,那么这原创 2016-10-23 11:36:58 · 274 阅读 · 0 评论 -
洛谷 1415
这道题比较神奇,第一次做到这样的DP题,我们令dp[i]表示序列1--i中满足序列递增且使最后一个数最小,最后一个数的起始位置,这样的话转移方程为dp[i]=max(j),其中dp[j-1]--j-1这段区间的值小于j--i这段区间的值,有了这个以后我们可以知道最后一个数是什么(暂时不考虑前导0),那么我们可以再用同样的方法,令f[i]表示i--dp[n]-1这段区间里满足序列递增且使第一个数最大原创 2016-10-23 17:09:43 · 254 阅读 · 0 评论 -
洛谷 1063
经典环型DP题,对于这种环形DP,我们可以断环为链,即将环复制一遍放在尾部,我们设计状态F[i][j]表示合并了i--j的珠子获得的最大能量,则有F[i][j]=max(F[i][k]+F[k+1][j]+合并的能量),我们考虑转移的顺序,转移的顺序必须能够保证我在做当前转移时,我所需要的量全部都已知,因此我们不能按照左端点递增的顺序转移,因为按照这种顺序转移需要的状态还未完全已知,会丢失最优解,原创 2016-10-24 10:15:44 · 359 阅读 · 1 评论 -
洛谷 1052
离散化+DP,还是第一次做这种题,这题的DP不难想,令F[i]表示到达i点最少踩的石子数,则F[i]=min(F[j]),i-s#include#include#includeusing namespace std;#define maxn 1005int f[maxn*maxn],n;int s,t,m,d[maxn];int flag[maxn],ans=1005;bool原创 2016-10-24 19:13:24 · 449 阅读 · 0 评论 -
NOIP 2015 字串
这道题考场看的时候一点思路没有,当时自己什么也不会,就只能打打暴力。现在还要看题解...自己DP太弱了...首先我们设计状态,令f[i][j][k][0]表示A串只用1-i,B串匹配到j,A串分了k段,没有用第i个的方案数,f[i][j][k][1]则表示用第i个的方案数,则f[i][j][k][0]=f[i-1][j][k][0]+f[i-1][j][k][1],f[i][j][k][1]=f[原创 2016-09-26 21:47:33 · 352 阅读 · 0 评论