【计数DP】POJ 1277

POJ 1277

题目描述-戳我跳转

如果两个数之间的所有数(可以为 0 0 0个)小于这两个数的对称为好对
求有多少个 n n n个数的全排列的好对个数正好为 m m m(对 9937 9937 9937取模)

这道题求全排列个数,暴力可以想dfs,但想拿满分,数学方法或者dp
纯数学好像没思路,有的话在下面留言探讨

解法-DFS

枚举全排列,求好对个数,检验一下即可
另外可以用全排列展开尝试一下

解法-计数dp

对于全排列而言,我们可以用增添法,对于排好的数列,下一个数字可以插入到里面

当然我们希望能够差入最小的,这样我们就不需要考虑和别的凑成好对了,因为他只会与旁边的凑成好对

这样就出来了, 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 − 1 × 2 dp_{i,j}=dp_{i-1,j-1} \times 2 dpi,j=dpi1,j1×2
  2. 新插入的在中间- d p i , j = d p i − 1 , j − 2 × ( i − 2 ) dp_{i,j}=dp_{i-1,j-2} \times (i-2) dpi,j=dpi1,j2×(i2)

最后记得取模

当然我还挂在了一点 就是要判断 j j j的大小
j = 1 j=1 j=1只进行转移 1 1 1
j > = 2 j>=2 j>=2转移 1 , 2 1,2 1,2

记住初值 d p 1 , 0 = 1 dp_{1,0}=1 dp1,0=1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值