学习总结5

来源:互联网 发布:php网页设计培训 编辑:程序博客网 时间:2024/06/09 20:20

2017-12-08 DP学习

本次学习内容主要有树形DP,状压DP,概率DP和数位DP。

树形DP例题

codeforces 219 D Choosing Capital for Treeland

给出N个点,其中有N-1条有向边,边的方向可以改变,问最少改变多少条边可以从某一个点到达任意一个点,同时求出这些点。直接求是O(n2)的,需要优化。注意到一个节点的答案已知的情况下,任意与其直接有边相连的结点答案都可以O(1)求出。于是可以先通过一遍DFS求出一个点的答案,再通过一遍DFS求出所有点的答案。

poj 3107 Godfather

给一颗n个结点的树,节点编号为1~n,问删除一个节点之后,让剩下的分支中节点数量最多的尽量少。求树的重心模板题。

HDU 4980 A simple graph problem.

有一颗n个节点的树,每条边有边权。现在你要在这些节点让放一些队员,让队员访问完全部的边。放置一个队员的代价是K,一个队员经过一条边需要付出边权的代价。并且一个队员不能经过同一条边两次。问最小代价是多少。记dp[i][j]表示i这个节点的子树的边全部访问完全,并且有j个队员的终点在i点(即还可以再往上走)。注意发现每个节点往上的路径不会超过2条(不然就可以省掉一个队员),所以j的范围是[0,2]。转移不难推出。

数位DP例题

poj 3252 Round Numbers

算出区间内二进制中0的个数大于等于1的个数的数字有多少个。就是一个二进制的数位DP。用数位DP的套路,f[l][one][zero][flag] 表示还剩l位数,前面有one个1,zero个0,并且是否顶上界。转移时直接枚举当前位取0还是1。

HDU 4734 F(x)

定义f(x)=ni=1(ai2i1)ai表示十进制数x中第i位的数字。给出a,b,求出bi=0[f(i)f(a)]。dp[l][res]表示有l位,并且还剩下res的f值供我们选择。直接枚举下一位转移。

Codeforces 55D Beautiful numbers

求一个区间内的Beautiful numbers有多少个。Beautiful numbers指:一个数能整除所有组成它的非0数字。例如15可以被1和5整除,所以15是Beautiful numbers。比较朴素的想法是令f[len][num][lcm][flag] 表示长度为len位,当前位的数对2520取余后的值为num,截止当前位的所有数码的最小公倍数为lcm的数的个数。flag表示当前数是否顶住上界。但这样做数组是开不下的。注意到1到9的最小公倍数为2520,它仅有48个因数,所以lcm这一维可以离散化,这样就解决了这个问题。

计蒜客 阿里云秘钥池

求1到n之间,在p进制下,每位两两互素的数的个数。n<=1e18,p<=1e5。记f[i][j]表示p进制下长度为i,最高位为j的数的个数,那么易知f[i][j]=p1k=1([gcd(j,k)=1]f[i1][k])。使用莫比乌斯反演,得f[i][j]=d|j(μ(d)1k<p,d|kf[i1][k])。而后按位枚举并统计答案。

状压DP例题

CodeForces 453B Little Pony and Harmony Chest

给出一个序列a,求取一个序列b,b序列的数两两互质,问能够导致∑|ai−bi|最小的方案。其中ai<=30,序列长度小于100。时限4秒。定义f[i][j]表示前i个数达到j状态的最小的结果,j状态表示已经被用过的质数。因为ai不超过30,所以如果选一个超过60的数一定不会比1优,所以可能存在于最优解中的数的质因子一定不会超过60。而60以内的质数共有17个,状压即可。

CDOJ 1296 A Graph Problem

有n个城市和m条双向路,有k个人,每个人选了两个不同的城市。现在让你尽可能多的删除边,是的这k个人每个人都可以从选的两个之间移动。此题思维难度较大。令dp[i]表示,这些点连在一起的时候,最少需要多少边。dp1[i]表示,这些点连在一起的时候,可以有其他的点也并入,最少需要多少边。通过k个城市对,可以分成一些联通的集合。dp2[i]表示,这些集合对应的点连在一起的时候,最少需要多少边。dp3[i]表示,这些集合可以相互不连通的时候,最少需要多少边。使用压位的方法枚举子集,依次递推。

poj 1753 Flip Game

给一个44的黑白棋盘,当把一个格子的颜色反转时,其上下左右的格子的颜色也被反转,问至少反转几次可以使44的正方形变为纯白或者纯黑。直接枚举第一行,检验最后一行是否满足即可。

CDOJ214 Lights

有N(N<35)盏灯,每盏灯有开和关两种状态,每个灯有一个开关,用来改变对应灯的状态。灯之间有M(M<=595)个链接,若两灯相连,它们的状态会同时改变。问至少按多少个开关,才能使所有灯亮(保证至少存在一种方案使所有灯亮)。

概率DP例题

HDU 4405 Aeroplane chess

在一条有n个格点的线上掷骰子,有1-6六个值,如果当前位置不小于n,则胜利,有m个跳跃点,到x位置可以直接飞到y位置(x < y),问从起点开始到终点掷骰子的期望数。概率DP入门题目,状态定义与转移不难想到,只需特殊处理跳跃点即可。

Codeforces 148D Bag of mice

原来袋子里有w只白鼠和b只黑鼠 ,龙和王妃轮流从袋子里抓老鼠。谁先抓到白色老鼠谁就赢。王妃每次抓一只老鼠,龙每次抓完一只老鼠之后会有一只老鼠跑出来。每次抓老鼠和跑出来的老鼠都是随机的。如果两个人都没有抓到白色老鼠则龙赢。王妃先抓,问王妃赢的概率。 分四种情况转移:王妃抓到白鼠,王妃赢;王妃抓到黑鼠,龙抓到白鼠,龙赢;王妃和龙都抓到黑鼠,逃掉一只白鼠;王妃和龙都抓到黑鼠,逃掉一只黑鼠。

SGU 385 Highlander

随机给出 1,2,。。。,n 个数字的一个排列 i1,i2,…in,对应了一张有向图 G = (V, E),其中 V={1, 2, …, n},E={(1, i1), (2, i2), …, (n, in)}。问在最长环上的顶点数的期望值。 2 ≤ n ≤ 100。
一道好题。记f[i][j][k]表示排列中 i 个数字已经确定,最长环为 j,且有 k 个长度为 j 的环的方案数,g[i][j]=ijk=1f[i][j][k]
答案为

nj=2nk=1jkf[n][j][k]nj=2nk=1f[n][j][k]
状态转移方程如下。
f[i][j][k]=Ainif[ij][j][k1]l=2min(j,ij+1)g[ij][l]Ajni+jj0(i=j,i>1,k=1)(2ji2,1<k<ij)(2ji2,k=1)(Otherwise)

bzoj3317 First Knight

一个m×n的棋盘,左上至右下编号为(1, 1)至(m, n),并给定每个格子到周围四个格子的概率。一个骑士从(1, 1)开始,按照给定概率走,问到达(m, n)的期望步数。题目保证从任一格开始到(m, n)的概率均为1 。1≤m,n≤40,多组数据。此题的递推存在环,如果列出方程直接求解期望,时间上无法承受。但是通过观察发现每次消元最多消去2n个,所以复杂度降为O(n^3*m),可以通过。

总结

DP题目比较灵活,但其重中之重还是在于正确地推导状态定义与转移方程,剩下的都是套路了。DP也是一类需要多练习的题目,一定要多写多练。

原创粉丝点击