国庆清北 DP

Day4 DP
1.区间DP
合并傻子
N个矩阵,n0*n1 n1*n2 ....nN-1*nN
找到一个做乘法的顺序,使得运算次数最少
n*m m*k O(n*m*k)
数据化
f[l][r]第l个到第r个做完
f[l][l] = 0
枚举最后一个乘法是哪个乘法,分界点
f[l][r]=min{f[l][k]+f[k+1][r]+n[l-1]*n[k]*n[r]}
n[i-1]第i个矩阵的行数,n[i]列数
ans=f[1][n]

最外层枚举的是区间长度
for i
for j
for k ×
从2开始枚举长度,

O(n^3)
2.树形DP
f[i]表示 以i为根的子树的信息
枚举所有儿子,合并儿子信息
f[i]=sigma f[j]
j∈son{i}
O(n) 所有点儿子个数之和
叶子节点往上DP
dis(i,j) 从i到j距离
求所有点之间距离
f[i]表示从i到自己子树里面所有点之和
f[i]=sigma f[j]+sz[j]
j∈son{i}
对于i到所有点的距离之和
在子树 f[i]
不在子树 祖先
别的子树
i是1的儿子
无论怎么走,都经过根
f[1]-f[i]+sz[i]//刨掉i子树
f[1]-f[i]+sz[i]+sz[1]-sz[i]//多走一步
f[1]-f[i]+sz[i]+sz[1]-sz[i]+f[i]//加上子树内
i不是1的儿子
都经过fa[i]=k
已经算过
f[i]子树内 sz[i] g[i]子树外 f[i]+g[i]???????
3.数位DP
l,r问从l到r有多少个数 r-l+1
一位一位的填,从高位到低位填
f[i][j][k] i从高位到低位,已经填到了第i位,
j 0/1变量 j=0 18->i已经满足>l j=1 这几位和l一样
k 0: 18->i已经满足<r 1: =r
f[i-1] j=0,k=0 0~9随便填
j=1,k=0 l的i-1位<填的数<9
.
.
f[i][j] i表示从高到低填到第几位
j 0/1 <x =x
l<= <=r --> !<=(l-1) && <=r 前缀和思想
windy数
幸运数字
4.状压DP
n个数 1,2,3,4,5....n
能组成多少个不同的排列
f[s],n个东西选还是没选用一个数来表示
转移:枚举下一个数要选什么
i 0->n-1
if((s>>i)&1==0) i个东西没选
f[s|(1<<i)]+=f[s]
ans=f[(1<<n)-1]
状压复杂度至少2^n 状态2^n
n在22,23左右
从一号点出发,所有点走一边,走的最小距离这和 旅行商问题
爆搜搜不过
枚举下一个点走什么
f[s]=
f[s|(1<<i)]
不知道从哪个点走过来
f[s][j]最后停在j的最短距离
f[s|(1<<i)][i]=f[s][j]+dis(i,j) //s,i,j????
O(n^2*2^n)
售货员的难题
5.插头DP ×
6.其它DP 90%

posted @ 2018-10-04 19:07  lcan  阅读(132)  评论(0编辑  收藏  举报