DP泛做

DP泛做

[CF455 A] Boredom

题目大意

n,ai,ai,ai1ai+1,,

题解

dp[i,1]:[1,i],i
dp[i,0]:[1,i],i
dp[i,1]=dp[i1,0]dp[i,0]=max{dp[i1,1],dp[i1,0]}
CODE

[CF629 D] Babaei and Birthday Cake

题目大意

n,
1.
2.

题解

dp[i]:=max{dp[j]+v[i]}    (v[i]>v[j])
v[i],线
CODE

[CF631 E] Product Sum

题目大意

n,iai,,使,

题解

[CF613 D] Kingdom and its Cities

题目大意

给定一棵树,多次给定一些关键点询问最少拆掉多少非关键点使得任意两关键点间不可到达

题解

建立虚树,树形DP自己YY一下就好啦
CODE

[BC75 C] King’s Order

题目大意

3,n

题解

dp[i,j]:ij
dp[i,1]=(dp[i1,1]+dp[i1,2]+dp[i1,3])25
dp[i,2]=dp[i1,1]
dp[i,3]=dp[i1,2]
dp[1,1]=26
ans=dp[n,1]+dp[n,2]+dp[n,3]
CODE

[BC71 C] KK’s Number/[BZOJ2091] [Poi2010]The Minima Game

题目大意

n,AB,
,A,AB

题解

,,,DP
dp[i]:A,i
dp[i]=max(x[j+1]dp[j])
CODE

[BZOJ2302] [HAOI2011]Problem c

题目大意

nn,ai,{a}, ai,aiai+1,,n, 已经确定了序列的一部分,询问合法序列数

题解

合法与人去坐的先后顺序无关
,i,ij=1num[j]i
dp[i,j]:i,j
dp[i,j]=ji+1k=cnt[i]dp[i1,jk]Ckcnt[i]sum[i]cnt[i](jk)
sum[i]i,n>i
cnt[i]i
jki1kcnt[i]
sum[i]cnt[i](jk):ii1,
kcnt[i]:i
一开始交,组合数求错了…
c[i,j]=c[i1,j1]+c[i1,j]
CODE

[BZOJ3864] Hero meet devil

题目大意

AGCTS(|S|15),1i|S|
AGCTm(1m1000)T,使LCS(S,T)=i

题解

[BZOJ3233] [Ahoi2013]找硬币

题目大意

构造一个硬币序列\{a_i\}a_1=1,a_i是a_j的整数倍,使得购买n种物品所需硬币数量最小(每个物品必须用刚好满足的钱数购买),询问最小数量

题解

性质:当我们知道最大面值的硬币了,我们就能知道这个序列的其他面值是最大面值的因子了,且购买物品时是贪心购买
dp[i]:用最大面值为i的硬币序列购买所有物品的最小硬币数
dp[i]=min\{dp[j]-\sum_k\frac{x[k]}{i}*(\frac{i}{j}-1)\}~~~~(j是i的因子)
若i/j不是质数,即=p_1*p_2,那么我们从面值为j*p_1那里转移是一定更优的,因为最大面值大了,且与j是倍数关系,一定包含j的硬币序列
dp[i]=min\{dp[i/j]-\sum_k\frac{x[k]}{i}*(j-1)\}~~~~(j\in prime)
CODE

[BZOJ4069] [Apio2015]巴厘岛的雕塑

题目大意

有那个点(有顺序),每个点有权值,要求分成m段(m\in[A,B]),使得每组权值和的or值最小

题解

因为是位运算,所以我们贪心从高到低来求答案
dp[i,j]:前i个分成j组且满足高位已经定下来的条件,这一位是否为0
因为or运算如果最后结果为0那么必须都为0所以比较好求
sum=sum[i]-sum[k]
dp[i,j]=\begin{cases}1&dp[k,j-1]=1且sum\&amp;amp;(1<<(pos-1))=0且sum|ans=ans\\0\end{cases}
判断在[A,B]范围内是否满足条件即可
复杂度O(30*N^3)
对于最后一个subtask,A=1
dp[i]:前i个数,满足前面确定的条件下最少分多少组
sum=sum[j]-sum[i]
dp[i]=\min\{dp[j]+1\}~~~(sum\&amp;amp;(1<<(pos-1))=0)且(sum|ans=ans)
CODE

[BZOJ4380] [POI2015]Myjnie

题目大意

有n家店,有m个人来购买物品,第i个人购买l[i]到r[i]的店铺中花费最小的l物品,若这个物品价值>val[i]则不进行购买
构造每家店的价格使得所有店的收益之和最大
有SPJ

题解

[BZOJ1026] [SCOI2009]windy数

题目大意

定义windy数为相邻两位的差都\ge 2的数
询问[A,B]内windy数数量

题解

数位DP
dp[i,j]:i位最高位为j的windy数个数
等价于求[1,A]的windy数个数
假设A的最高位为a_1,后面同理
首先是位数比A小的\sum_{i=1}^{len[a]-1}dp[i,j](1\le j\le9)肯定要计入答案
其次是位数于A相同,但最高位比a_1小的\sum_{i=1}^{a_1-1}dp[len[a],i]
最后是位数与A相同最高位与a_1相同,第二位比a_2小的且满足windy数的个数
\sum_{j=0}^{a_2-1}dp[len[a]-1,j](|a_1-j|\ge2)
也就是我们依次让后面那些位与A那一位的数相同
当|a_i-a_{i-1}|< 2时就停止继续将后面的计入答案了
最后注意一下,这种统计方法是无法将A本身计入的,所以我们最后答案是count[b+1]-count[a]
CODE

[BZOJ1833] [ZJOI2010]count 数字计数

题目大意

询问[A,B]的所有数中0~9各出现多少次

题解

dp[i,j,k]:表示有i位最高位为j,k出现了多少次
dp[i_1,i_2,i_3]=\sum_{i_4=0}^{9}dp[i_1-1,i_4,i_3]+10^{i_1-1}(i_3=i_2)
dp[i_1,i_2,i_3]=\sum_{i_4=0}^{9}dp[i_1-1,i_4,i_3]~~~~~~~~~~~~~~~(i_3\not=i_2)
统计[1,A]时,先ans[j]=\sum_{i=1}^{len[A]-1}\sum_{k=1}^{9}dp[i,k,j]
再ans[j]+=\sum_{i=1}^{a_1-1}dp[len[A],i,j]
最后ans[j]+=\sum_{k=1}^{len[A]-1}\sum_{i=0}^{a_k-1}dp[k,i,j]
并且ans[x[i]]+=A[i+1..len[A]]
最后不要输出空格…..
CODE

[BC66 C] GTW likes czf

题目大意

给定区间[L,R]和两个数G,T,从[L,R]和G,T中各自任取一个数A和B,得到C=A@B,询问有多少种C
定义@运算为A@B=((A\&amp;amp;B)|B)^B)

题解

,A@B=A ^ B
1^ 10
0 ^10
位运算的每一位都不干扰,所以一个数亦或任意数的值都是不同的
所以 ans=(rl+1)2
=[i ^ G=j ^ T]
(,..),i ^ j=S ^ T
P=S^ T
ri=lrj=l[i^ j=P]
count(x,y)=xi=1yj=1[i ^ j=P]
count(r,r)count(l1,r)count(l,r1)+count(l1,l1)
count(l1,r)=count(l,r1)...
DPcount(i,j)
dpdp[i,j,k]:i,j,k
j,k
0,0:i,
0,1:i,
1,0:i,
1,1:i,
我们认真讨论一下
x[i]:i,y[i],p[i]
(i,j,k)x[?]=i,y[?]=j,p[?]=k

0^0=01^1=01^0=10^1=1
(0,0,0)
dp[i,1,1]=dp[i+1,1,1]dp[i,0,0]=dp[i+1,0,0]2dp[i,1,0]=dp[i+1,1,0]dp[i,0,1]=dp[i+1,0,1]
(0,0,1)
dp[i,1,1]=0dp[i,0,0]=dp[i+1,0,0]2dp[i,1,0]=dp[i+1,1,0]dp[i,0,1]=dp[i+1,0,1]
(0,1,0)
dp[i,1,1]=0dp[i,0,0]=dp[i+1,0,0]2+dp[i+1,0,1]dp[i,1,0]=dp[i+1,1,0]+dp[i+1,1,1]dp[i,0,1]=dp[i+1,0,1]
(0,1,1)
dp[i,1,1]=dp[i+1,1,1]dp[i,0,0]=dp[i+1,0,0]2+dp[i+1,0,1]dp[i,1,0]=dp[i+1,1,0]dp[i,0,1]=dp[i+1,0,1]
(1,0,0)
dp[i,1,1]=0dp[i,0,0]=dp[i+1,0,0]2+dp[i+1,1,0]dp[i,1,0]=dp[i+1,1,0]dp[i,0,1]=dp[i+1,0,1]+dp[i+1,1,1]
(1,0,1)
dp[i,1,1]=dp[i+1,1,1]dp[i,0,0]=dp[i+1,0,0]2+dp[i+1,1,0]dp[i,1,0]=dp[i+1,1,0]dp[i,0,1]=dp[i+1,0,1]
(1,1,0)
dp[i,1,1]=dp[i+1,1,1]dp[i,0,0]=dp[i+1,0,0]2+dp[i+1,1,1]+dp[i+1,1,0]+dp[i+1,0,1]dp[i,1,0]=dp[i+1,1,0]dp[i,0,1]=dp[i+1,0,1]
(1,1,1)
dp[i,1,1]=0dp[i,0,0]=dp[i+1,0,0]2+dp[i+1,0,1]+dp[i+1,1,0]dp[i,1,0]=dp[i+1,1,0]+dp[i+1,1,1]dp[i,0,1]=dp[i+1,0,1]+dp[i+1,1,1]
,
dp[63,1,1]=130
CODE

[BZOJ3209] 花神的数论题

题目大意

sum(i):i1
ni=1sum(i)(mod10000007)
i1015

题解

sum(i)60,dp,
CODE

[BZOJ3329] Xorequ

题目大意

给定方程 x ^3x=2x,询问
1.[1,n]
2.[1,2n](mod1e9+7)

题解

x ^3x=2x等价于 x ^2x=3x
那么 x+2x=3x=x ^ 2x
2x=x<<1
x1
第一问数位DP解决即可
第二问是斐波那契数列…矩阵搞之
CODE

[BC70 C]Jam’s maze

题目大意

给定一个正方形矩阵,每个点代表一个大写字母,从左上角走到右下角,且只能向下或向右走,询问走出的路径是回文的条数 (mod5201314) FFFF!

题解

dp[x1,y1,x2,y2]:(1,1)>(x1,y1)=(x2,y2)<(n,n)
dp[x1,y1,x2,y2]+=dp[x11,y1,x2+1,y2]dp[x11,y1,x2,y2+1]dp[x1,y11,x2+1,y2]dp[x1,y11,x2,y2+1]    (t[x1,y1]=t[x2,y2])
但空间时间都承受不了,所以我们考虑优化无用状态
当我们知道走多少步之后,只需知道一个坐标值就可以知道另一个了,这样优化掉一维
走多少步那一维可以滚动数组优化掉
CODE

[BZOJ4011] [HNOI2015]落忆枫音

题目大意

DAG(10),,1(mod1e9+7)

题解

DAGni=2deg[i](deg[i]:i)
,

syxjsj1deg[j]

dp
dp[i]:syijsj1deg[j]

pre1/2/...i
sypre1jsj1deg[j]
sypre2jsj1deg[j]

syijsj1deg[j]
dp[i]=jidp[j]deg[i]
dp[y]=ni=2deg[i]deg[y]
注意连边到根节点1的情况要特判一下
贴上求拓扑序的代码,好久不写手好生

procedure dfs(a,b:longint);
var tt:longint;
begin
        vis[a]:=1; tt:=w[a,2]; if (a=b) then tt:=0;
        while (tt<>0) do
        begin
                if (vis[w[tt,1]]=0) then dfs(w[tt,1],b);
                tt:=w[tt,2];
        end;
        inc(len); x[len]:=a;
end;

CODE

[BZOJ3727] PA2014 Final Zadanie

题目大意

,1,b[i]=nj=1dis[j,i]a[j],b[i],a[i]

题解

b[1]=dep[i]a[i]
b[i]=b[fa[i]]+size[1]2size[i]
b[i]b[fa[i]]=size[1]2size[i]
size[i]=12size[1](b[i]b[fa[i]])2
a[i]=size[i]size[son[i]]
线性得到 a[i]size[1]:a[i]=k[i]1size[1]+k[i]2
b[1]=(dep[i]k[i]1)size[1]+dep[i]k[i]2
size[1]
size[i]=12size[1](b[i]b[fa[i]])2
size[i]=a[i]+size[son[i]]
a[i]=size[i]size[son[i]]
貌似数学推导更多些,没有太强的树形DP的感觉
CODE

[BZOJ3257] 树的难题

题目大意

,,0,1,2,使01,

题解

f[i]:i0 g[i]:i1 h[i]:i11
x[i]=0 f[i]=inf g[i]=jming[j],f[j]+w[i,j],h[j]+w[i,j] h[i]=minh[j]+kjming[k],f[k]+w[i,k],h[k]+w[i,k]
x[i]=1 f[i]=jminf[j],g[j]+w[i,j],h[j]+w[i,j] g[i]=inf h[i]=jming[j],f[j]+w[i,j],h[j]+w[i,j]
x[i]=2 f[i]=jminf[j],g[j]+w[i,j],h[j]+w[i,j] g[i]=jming[j],f[j]+w[i,j],h[j]+w[i,j] h[i]=minh[j]+kjming[k],f[k]+w[i,k],h[k]+w[i,k]
CODE

[BZOJ1040] [ZJOI2008]骑士

题目大意

给定一个基环树林,每个点上有权值,要求选择一个权值和最大的点集,要求点集中的任意两个点之间不能直接相连

题解

拆环,讨论,树形DP
CODE

[BZOJ4033] [HAOI2015]T1

题目大意

,m,+,

题解

dp
dp[i,j]ij,
,
dp[i,j]ij,

get  too  naive...
CODE

[BZOJ3829] [Poi2014]FarmCraft

题目大意

给定一棵树,从1号节点出发对树进行欧拉遍历,每到达一个点这个点就开始装MC,每个点装MC的时间不同,最后回到1号节点装MC,求所有人都能联机的最少时间

题解

f[i]:if[i]
f[i]=min{json[i]max{0,f[j]kj(size[k]2+1)}}+max{0,val[i]}
f[j]size[k]2+1+f[k]f[k]size[j]2+1+f[j]

[BZOJ3831] [Poi2014]Little Bird

题目大意

n,ii+k,,+1,

题解

dp[i]=max{dp[j]+[x[j]x[i]]}    (ikj<i)



,
1.
2.
3.(1,)
CODE

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值