一类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的网格模型的主要内容,如果未能解决你的问题,请参考以下文章

线性DP的几种模型和例题

zbrush模型旋转地网格位置不变

Three.js教程:点线网格模型介绍

如何使用父“模型”访问子“模型”数据以在 extjs 的网格中显示

确定估计其中一类概率的模型的准确性

Abaqus如何对模型局部做更细密的网格划分