您的位置:首页 > 其它

dp(不含优化) 12 - 08

2017-12-08 21:04 141 查看

树形dp

codeforces 219 D

Description

给出 N 个点,其中有 N−1 条有向边,边的方向可以改变,问最少改变多少条边可以从某一个点到达任意一个点,同时求出这些点。

Solution

dp[u] 表示 u 到达以它为根的子树的所有点需要改变的边数。

dir[u] 表示 u 到父亲的边的方向。

于是我们可以换根。

dp[u]=dp[p]+dir[u]?−1:1

poj 3107 Godfather

Description

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

Solution

想必会点分治的都懂。

无名

Description

给你一颗树,每个节点都有权值,有些节点也是陷阱。现在从树上一点出发,不经过重复的节点,到另一个节点终止,并且经过最大不超过 C 个陷阱( C<4),要求路径的权值和最大。

Solution

dp 可以 O(n) 做。

dp[u][i] 表示从 u 出发往下,经过 i 个陷阱,权值和最大值。

v 是 u 的儿子们。

dp[u][i]=value[u]+max(dp[v][i−isTrap[u]])

这道题在 C 很大的时候就必须点分治了,维护一个桶,有点像bzoj 2599 ,复杂度 O(nlogn) 。

hdu 4980 A simple graph problem.

Description

有一颗 n 个节点的树,每条边有边权。现在你要在这些节点让放一些队员,让队员访问完全部的边。放置一个队员的代价是 K ,一个队员经过一条边需要付出边权的代价。并且一个队员不能经过同一条边两次。问最小代价是多少

Solution

dp[i][j] 表示 i 这个节点的子树的边全部访问完全,并且有 j 条向上的队员(队员总是可以向上走)。

数位dp

poj 3252 Round Numbers

Description

算出区间内二进制中 0 的个数大于等于 1 的个数的数字有多少个。

Solution

直接把所有的数转成二进制数考虑,然后数位 dp 裸题。

hdu4734 F(x)

Description

我们定义十进制数 x 的权值为f(x)=a(n)×2(n−1)+a(n−1)×2(n−2)+...a(2)×2+a(1)∗1,a(i)表示十进制数x中第i位的数字。

题目给出 a,b ,求出 0 b 有多少个不大于 f(a) 的数。

Solution

dp[i][j] 表示 i 位数比 j 小的数的个数。

dp[i][j]+=dp[i−1][j−k×(1<<i−1)]

考虑边界。如果 j 小于0,显然 dp[i][j]=0 。如果 i==0,显然任何数都比0大,所以 dp[i][j] 对于 0≤j 的时候 dp[i][j]=1 ,否则 dp[i][j]=0 。

codeforces 55 D

Description

求一个区间内的 Beautiful numbers 有多少个。 Beautiful numbers 指:一个数能整除所有组成它的非 0 数字。

例如 15 可以被 1 和 5 整除,所以 15 是 Beautiful numbers 。

Solution

最简单的那种会 mle 的数位 dp 想必大家都会。显然 lcm 一定可以整除 2520 ,而可以整除 2520 的数只有 48 个。然后又是板。

状压dp

CodeForces 453B

Description

给出一个序列 a,求取一个序列 b , b 序列的数两两互质,问能够导致 ∑|ai−bi| 最小的方案。其中 ai≤30 ,序列长度小于 100 。

Solution

dp[i][j] 表示前 i 个数达到 j 状态的最小结果,j 是一个状压,表示已经被用过的质数。

因为当 a 的数据范围不超过 30,所以如果某个数超过 60,那么选择 1 一定比它更优,所以我们能够用到的数的质因子也一定不会超过 60,也才 17 个。所以就可以很暴力的状压了。

CDOJ 1296

Description

有 n 个城市和 m 条双向路,有 k 个人,每个人选了两个不同的城市。现在让你尽可能多的删除边,是的这 k 个人每个人都可以从选的两个之间移动。

n≤15,k,m≤(n−1)×n2

Solution

这个题做法有点乱七八糟。

dp[i]

状态里面点连在一起时,组成一个连通块,这个连通块有且仅有 i 中的点,最少需要多少边。要么为 −1 (表示不可行),要么为 cnt−1。

dp1[i]

状态里面点连在一起时,组成一个连通块,最少需要多少边。

这个可以由 dp[i] 得到。

通过 k 个城市对,可以分成一些联通的集合。

dp2[i]

这些集合对应的点连在一起的时候,最少需要多少边。二进制表示连通块的选与不选。

这个可以由 dp1[i] 得到。

dp3[i]

这些集合可以相互不连通的时候,最少需要多少边。

这个可以通过把 i 拆了,把他们的 dp2 加起来。

概率与期望dp

hdu4405 Aeroplane chess

Description

在一条有 n 个格点的线上掷骰子,有 1−6 六个值,如果当前为止超过 n ,则胜利,有 m 个跳跃点,到 x 位置可以直接飞到 y
14cec
位置( x<y ),问从起点开始到终点掷骰子的期望数。

Solution

dp[i] 表示从 i 走到终点的期望步数。

dp[i]=0(i>n)

dp[i]=∑6j=1dp[i+j]6+1(!isJump[i])

dp[x]=dp[y](isJump[x])

Codeforces 148D

Description

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

Solution

dp[i][j] 表示轮到王妃抓老鼠时面对剩余 i 只白鼠和 j 只黑鼠的胜率。

王妃胜利,转化概率为 ii+j 。

dp[i−1][j−2]

王妃抓黑鼠,龙抓黑鼠,逃跑白鼠,转化概率是 j×(j−1)×i(i+j)×(i+j−1)×(i+j−2)

dp[i−1][j−1]

王妃抓到黑鼠,龙抓到白鼠,输!转化概率为 j×i(i+j)×(i+j−1)。这不能到达,到达就输了

dp[i][j−3]

王妃抓到黑鼠,龙抓到黑鼠,逃跑黑鼠,转化率为 i×(j−1)×(j−2)(i+j)×(i+j−1)×(i+j−2)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: