一类dp的网格模型
Posted guessycb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一类dp的网格模型相关的知识,希望对你有一定的参考价值。
关于形如(f_{i,j} = sum_{t=1}^{|w|}sum_{k=1}^{|v|}f_{i+w_t,j+v_k}),其中(w_t,v_k)为一个定值的(dp)转移。
可以考虑放到坐标上,画出其转移路线,然后考虑组合意义。
Section1
求(sum_{i,j} inom{a_i+b_i+a_j+b_j}{a_i+a_j}),其中(a,bleq 4000,nleq 10^6)。
(inom{a_i+b_i+a_j+b_j}{a_i+a_j})等价于从((-a_i,-b_i))走到((a_j,b_j))的方案数。
建图后直接从左下往右上暴力(dp)出解。
Section2
定义一个(n)的排列合法,当且仅当:设(n)的位置为(x),有:
[p_1<p_2<p_3....<p_{x-1}<p_x>p_{x+1}>....>p_{n-1}>p_n]
有(m)个限制((pos,v)),形如(p_{pos} = v),
数据范围:(mleq nleq 10^5),求合法排列数。
考虑从小往大放,设(f_{i,j})表示放完(1,2...i),左侧放了(j)个。
转移方程:(f_{i,j} =f_{i-1,j-1} +f_{i-1,j})。
初始在((0,0))每次放一个相当于移动((+1,0))或((+1,+1))。
限制相当于限制(f_{v,j})必须通过特定方向到达该点。
而每一列最多就两个特殊点,直接对特殊点进行(dp),最后一列特殊处理一下即可。
Section3
[JLOI2015]骗我呢
考虑突变的位置,设(f_{i,j})表示做到第(i)行,该行突变位置为(j)。
有:(f_{i,j} = f_{i,j-1} +f_{i-1,j+1}),其中(f_{i,0} = f_{i-1,0})。
画出转移路线,把转移路线拽直可以发现,问题转化为:
从((0,0))出发,到达((n+m,n)),且不经过(y=x+2)和(y=x-(m+1))的方案数u。
容斥计算。
Section4
[NOI2018]冒泡排序
设(f_{i,j})表示还剩下(i)个要放,前面的最大值为(j)的方案数。
显然当前点要么放比(j)大的数,要么放还没放的数中最下的那个。
由于我们是逆推所以:(f_{i,j} = f_{i-1,j} + sum_{k=j+1}^{n} f_{i-1,k} = sum_{k=j}^n f_{i-1,k})。
考虑统计答案,枚举在哪个点(i)开始处于自由态。
由于不会放(a_i),而(a_ileq max_{pre}),所以一定只能放比(max_{pre})大的数。
此时的方案数为(sum_{k=max_{pre}+1}^n f_{n-i,k} = f_{n-i+1,max_{pre}+1})。
唯一的问题变为如何快速处理(f)。
显然合法的(f_{i,j})需要满足(jge n-i),画出转移路线图,问题转化为:
从((0,n))出发,不经过(y=-x+(n-1))到达((i,j))的方案数。
这是经典问题,答案为 (inom{i+n-j}{i} - inom{i+n-j}{i+1})。
以上是关于一类dp的网格模型的主要内容,如果未能解决你的问题,请参考以下文章