DP
文章平均质量分 85
meopass
即使摸爬滚打,满身泥泞,我也要前进
展开
-
HDU 6197 LIS
简略题意:问把一个长度为nn的数组,去除掉kk个数,剩下的能不能构成非递增或非递减序列。换一个角度理解题意就是:问原数组是不是存在长度大于等于n−kn-k的非降或者非增序列。就是很简单的LIS问题了。#include <bits/stdc++.h> using namespace std;const int N = 1e5+10;int t, n, k; vector<int> V;namespac原创 2017-09-13 14:46:27 · 294 阅读 · 0 评论 -
codeforces23E Tree 树形DP + 大数
令dp[i][j]dp[i][j]dp[i][j]代表以i为根的子树,其所在通块大小为jjj时的最大乘积。 那么暴力枚举其子树所在的联通块大小,即得到转移: dp[u][j+k]=max(dp[u][j+k],dp[u][j]∗dp[v][k])dp[u][j+k]=max(dp[u][j+k],dp[u][j]∗dp[v][k])dp[u][j+k] = max(dp[u][j+k], dp...原创 2018-05-24 19:08:02 · 252 阅读 · 0 评论 -
HDU5909 FWT加速异或卷积
简略题意: 从一个节点数为nnn的树中选出一颗子树,这个子树的值为它所有的节点的值异或起来的结果。现在需要你输出异或值分别为[0,m)[0,m)[0, m)的方案树。 先考虑简单的树形DPDPDP 以dp[u][i]dp[u][i]dp[u][i]代表以u为根的子树,所有节点的值异或起来为iii的方案树。 那么存在转移 dp[u][i]=∑v∈son(u)dp[v][j]∗dp[u][i...原创 2018-05-17 17:25:56 · 520 阅读 · 0 评论 -
sgu104 DP
简略题意: 有n个花瓶和m朵花,第i个花瓶插着第j朵花的价值是v[i][j]v[i][j]v[i][j],问n个花瓶插满的最大价值是多少。 需要注意的是里面有一组偏序关系: 若第i个花瓶插着第j朵花,那么第i−1个花瓶插着的花的序号一定小于j。若第i个花瓶插着第j朵花,那么第i−1个花瓶插着的花的序号一定小于j。若第i个花瓶插着第j朵花,那么第i-1个花瓶插着的花的序号一定小于j。 那么两...原创 2018-04-26 14:57:18 · 185 阅读 · 0 评论 -
codeforces 895C Square Subsets 线性基 或 状压DP
简略题意:n个数,问有多少选择的方法能够使得这些数的乘积变成完全平方数。经典问题加强数据范围并不会把每个数唯一分解之后,用其质因子以及其对应的幂来表示这个数。如果若干个数乘积想要位完全平方数,那么势必要使得相乘后的每一个质数的幂为偶数。那么我们选择这个数的时候只需要在意他的所有质因子的幂次的奇偶性即可。因为数的大小只有70,至多只会有19种质因子,可以状态压缩。因此如果一个数的质因子的幂次为奇数,就原创 2017-11-27 06:24:30 · 443 阅读 · 0 评论 -
HDU6006 Engineer Assignment 状压DP
简略题意:n个项目,m个工程师,每个工程师可以提供Di种技术支持,每个项目需要Ci种技术,每个工程师只能属于一个项目。问最多能完成几个项目。因为每个工程师只能被用一次,那么根据当前还剩哪些工程师空闲,我们就可以知道当前这个项目能不能被完成。 用dp[i][j]代表当前处理到第i个项目,还剩下的工程师集合是j。 转移有两种: 1. 不做当前的项目, dp[i+1][j] = dp[i][j]。原创 2017-11-25 23:34:11 · 205 阅读 · 0 评论 -
2017 ICPC BeiJing Regional Hihocoder 1634 Puzzle Game
简略题意:给出一个n*m的矩阵,可以修改其中一个数字为p,使得最大子矩阵的值最小化。暴力的做法就是n*m的枚举节点,然后每次n3n^3的求最大子矩阵。 其实没有必要,假若我们求出了最大子矩阵唯一,那么我们只要枚举最大子矩阵的一个值修改之后,再求即可。 假若最大子矩阵不唯一,那么我们还是只要枚举任意一个最大子矩阵的值即可。因为如果两个最大子矩阵的有公共部分,那么答案必然可以被枚举到。如果没有公共部原创 2017-11-25 23:13:57 · 548 阅读 · 0 评论 -
codeforces 895D String Mark
简略题意:给出等长的AB串,问有多少A串的重排列得到的串字典序大于A串,小于B串。dp[i][0/1][0/1]代表当前处理到第i个位置,之前的选择有没有贴在上边界,有没有贴在下边界,考虑贴近上边界,下边界,或者不贴近边界,得到若干转移。 唯一需要注意的地方就是对于直接转移到dp[i][0][0]的状态,直接计算有重复元素的重排列即可,可以通过直接处理除数扣掉26的常数。#define other原创 2017-11-30 12:42:37 · 469 阅读 · 0 评论 -
HDU 6212 区间DP
简略题意:给出一个01串,连续相同的数大于等于3个可以消除。你可以任意在某个位置插入01,问至少插入多少个01能够使得原串被完全消除。n只有200,答案要求最优解,那么可以考虑区间dp的套路。 定义dp[l][r]代表将区间[l, r]都消除之后的最小代价,枚举转移i,复杂度O(n^3)。考虑转移,我们能做的事情是什么? 对某个位置插入01,使得这段被消除。 1. 枚举切除位置,将原有部分从中原创 2017-10-09 15:53:15 · 291 阅读 · 0 评论 -
codeforces 864E 背包
简略题意:若干个物品暴露在大火中,拯救第i个物品需要消耗tit_i时间,在did_i时这个物品就会被烧掉,这个物品的价值为viv_i,问能救下的物品价值最大是多少。首先要让物品有序,被烧毁的时间就是天然的序,按摧毁时间排序之后就是基础的DP。 dp[i][j]dp[i][j]代表当前处理到第i个物品,需要花费的时间是j,直接枚举之前救下的的物品转移即可。#include<bits/stdc++.h原创 2017-09-26 18:03:18 · 262 阅读 · 0 评论 -
codeforces 855C 树DP
简略题意:给出一颗树,有m种颜色,第k种颜色是特殊颜色,树上最多有x个特殊颜色点。 你需要把整个树染色,且保证特殊颜色节点以下条件: 1. 与其相连的不能有特殊颜色节点。 2. 与其相连的节点的颜色序号必须小于k。 问有多少种满足要求的树。这题的突破点在于x很小。 其实节点的颜色种类只有3种: 0. 能够和特殊颜色相连的点(小于k)。 1. 特殊颜色点(等于k)。 2. 特殊颜色外,原创 2017-09-26 10:48:00 · 1421 阅读 · 0 评论 -
codeforces 855E 数位DP
简略题意:每次询问[Li,Ri][Li, Ri]在bb进制下每种00 到 b−1b-1的数的个数都为偶数的个数,不包含前导0。典型的数位DP套路题,最多十个进制,对每个进制暴力进行数位DP。 考虑构造状态dp[bit][pos][sta][st]dp[bit][pos][sta][st],代表当前处理bitbit进制时,处理到第pospos个位置,状态为stasta,是否已经没有前导0。 对于每原创 2017-09-25 11:56:50 · 366 阅读 · 0 评论 -
codeforces 855B DP
简略题意:给出pp, qq, rr,给出nn个数v[i]v[i],问i≤j≤k,max(p∗ai+q∗aj+r∗ak)i \leq j \leq k, max(p*a_i + q*a_j + r*a_k)。枚举aja_j,当0≤p0 \leq p,选取max(ai),i∈[1,j]max(ai), i \in [1, j], 否则选取min(ai),i∈[1,j]min(ai), i \in [1,原创 2017-09-25 11:39:10 · 388 阅读 · 0 评论 -
codeforces 461B 树DP
题意:给出一棵树,每个节点的颜色为黑色或者白色,现在可以切割任意条边,使得答案这个树被分成若干块,每块至多一个黑色点。问方案数有多少。对于树dp,一般用dp[u]dp[u]表示当前u节点的子树的方案数,然后根据其与子节点的关系进行转移。 对于这题我们还需要记录,当前子树中是否已经有黑色点了,如果有,就可以切割,没有,就不能切割。这样状态的构造和转移都已经出来了。 dp[u][0/1]dp[u][原创 2017-09-25 11:27:50 · 238 阅读 · 0 评论 -
BZOJ 2002 分块
简略题意:某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏。游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞。绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞。为了使得游戏更有趣,Lostmonk原创 2017-09-22 22:55:52 · 191 阅读 · 0 评论 -
HDU 6199 DP
简略题意:AA和BB玩游戏,AA先手。有nn个数,第ii个数的大小为v[i]v[i]。第一次能从左边取11或22个数,之后假如之前取了kk个数,下次必须取kk或k+1k+1个数。A想要他的值尽可能比对方大,而B想要他的值尽可能比对方小。两人轮流行动,问最终结果是多少。Alice wants to maximize the difference while Bob wants to minimize原创 2017-09-14 18:35:23 · 336 阅读 · 0 评论 -
HDU 6201 树形DP 或 最长路
简略题意: nn个节点,n−1n-1条边,每个节点有一个点权v[i]v[i],代表这个点的物品售价。 每条边有一个权值,代表走这条路的花费。问从任意一点购买,在任意一点卖出的最高收益是多少。解法11:因为我们不知道从哪点出发到哪点终止。因此虚拟一个起点,一个终点,起点连接所有的节点,权值为−v[i]-v[i],代表买入的代价。 所有节点再连向终点,权值为v[i]v[i],代表卖出的收益。每条边原创 2017-09-14 17:56:11 · 320 阅读 · 0 评论 -
决策单调性小结
1D1D动态规划 指状态数为O(n)O(n)O(n),每个状态的决策数为O(n)O(n)O(n),直接求解的复杂度为O(n2)O(n^2)O(n2)的动态规划方程dp[i]=min/max{dp[j]+S[i,j]}dp[i] = min/max \{dp[j] + S[i, j]\}dp[i]=min/max{dp[j]+S[i,j]}。 斜率优化 斜率优化是1D1D的一种常见优化方式,一般的套...原创 2018-10-28 23:35:50 · 759 阅读 · 0 评论