【计数DP】SGU 221

SGU 221

题目描述-戳我跳转

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

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

解法-纯数学

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

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

解法-计数dp

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

另外 d p i , j dp_{i,j} dpi,j表示前 i i i行放 j j j个象的方案数,首先发现一行只能放一个’车’

转移方程需讨论:

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

发现问题了吧

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

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

这题就完美解决了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值