dp的精华内容是状态转移
状态转移首先的前提是相互影响,由a可以推出b
举一个物理上的例子:
像一图 木板全都立起来的时候,就算取出任意一片木板,对其他木板完全没有影响,那这样怎么构成dp呢(摸腮)
但像图二 木板是堆叠的,大木板在下面,小木板在上面,很多时候我们需要一片大模板(解决一个大问题),我们需要先把小木板拿起不断往下拿才能得到大木板。而且其实这里使了个小心机,我并没有把相同大小的木板都平放堆叠起来,而是不同大小的。正是因为不同大小,我们才更加容易把木板拿起来。
dp就像这一堆木板,设置状态【前i个xxx怎么怎么样】不正好像二图的木板吗。
好了开始讲中国象棋([AHOI2009]中国象棋 - 洛谷)这一题:
我们要设一个dp_all[i][j][k]表示前i行有j列只有1棋有k列有2棋
为什么要这么想呢???
因为我们找到了这一题的漏洞点,就是一列or一行只有可能出现0.1.2个棋子
而且每添一行我们可用排列组合的公式算出新的状态。
形式:不断给dp_all[i][j][k]+=dp_all[i-1][j-d][k-dd]*dp_hang[ii][kk](dp_hang表示的是排列组合的公式)
这样一道dp题最大体的框架就完成了。
当然我在写这道题的时候也出现的若干问题:
1、忘记mod
2、又一列1棋转变为一列2棋,忘记把一列1棋的数量减少(只求改变不求代价qaq)
3、算排列组合公式时直接算了n!忘记优化,直接就re了。