SGU 221

题目描述-戳我跳转

一个n×nn \times n的棋盘中有kk个象互不相吃的情况数

这道题明显求个数,可以考虑纯数学解法(输入无数组),但正解是计数dp

解法-纯数学

k=2×n2k=2 \times n - 2时,因为象之间不互相攻击,那么在同一个对角线上不可能存在两个棋子 但考虑到(1,1)( 1 , 1 )(n,n)( n , n )不能在同一对角线上,棋子最多为2×n22 \times n - 2

但这道题求的是个数,上面的这个推导是有公式的,我就不说了

解法-计数dp

首先对角线是不好做的,可以考虑旋转棋盘45°45°,把'象'变成'车'

另外dpi,jdp_{i,j}表示前ii行放jj个象的方案数,首先发现一行只能放一个'车'

转移方程需讨论:

  1. dpi,j=dpi1,jdp_{i,j}=dp_{i-1,j} 直接从上一行转过来
  2. dpi,jdp_{i,j}是上一行少一格转来的

发现问题了吧

如果对于每一行来说,他前面所有的行的个数都小于等于他 则这一行要新添棋子有((格子数j+1)- j + 1 ),所以我们先排一个序

此时第二类为dpi,j=dpi1,j1(aij+1)dp_{i,j}=dp_{i-1,j-1}*(a_i-j+1) 综上所述,dpi,j=dpi1,j+dpi1,j1(aij+1)dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}*(a_i-j+1)