AtCoder Beginner Contest 134 F - Permutation Oddness

问题重现

原题链接
P = ( p 1 , p 2 , p 3 , . . . , p n ) P = (p_1, p_2, p_3, ..., p_n) P=(p1,p2,p3,...,pn) { 1 , 2 , 3 , . . . , n } \{1,2,3,...,n\} {1,2,3,...,n}的排列,
定义 O d d n e s s : = ∑ ∣ p i − i ∣ Oddness := \sum |p_i - i| Oddness:=pii
求满足 O d d n e s s = k Oddness = k Oddness=k的不同排列 P P P的数量。

数据范围

  1. 输入均为整数
  2. 1 ≤ n ≤ 50 1 \leq n \leq 50 1n50
  3. 0 ≤ k ≤ n 2 0 \leq k \leq n^2 0kn2

样例

Input

3 2

Output

2

思路

这里以官方题解为基础,加以翻译并解释。

若存在一组兔子( R 1 ∼ R n R_1\sim R_n R1Rn)和一组海龟( T 1 ∼ T n T_1 \sim T_n T1Tn),请问有多少种方式可以形成 n n n组 (兔,龟) 组合,使得各组龟兔下标的差值(绝对值)求和之后恰等于 K K K

d p [ i ] [ j ] [ k ] [ l ] = dp[i][j][k][l]= dp[i][j][k][l]=表示在考虑 R 1 ∼ R i R_1 \sim R_i R1Ri T 1 ∼ T i T_1 \sim T_i T1Ti时,仍然有 j j j个兔没有在这个范围内找到配对、有 k k k个龟没有在这个范围内找到配对、可以确定的 o d d e s s oddess oddess l l l的排列数量。

因为在考虑前i个时,兔和龟未配对的数量实际上是相等的 ( j = k ) (j =k) (j=k),所以 d p dp dp数组可以简化浓缩为 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k],这里的 k k k继承之前 l l l的意义。

状态转移方程写作:
d p [ i ] [ j ] [ k ] = ( 2 j + 1 ) d p [ i − 1 ] [ j ] [ k − 2 j ] + ( j + 1 ) ( j + 1 ) d p [ i − 1 ] [ j + 1 ] [ k − 2 j ] + d p [ i − 1 ] [ j − 1 ] [ k − 2 j ] dp[i][j][k] = (2j + 1)dp[i-1][j][k-2j] + (j+1)(j+1)dp[i-1][j+1][k-2j]+dp[i-1][j-1][k-2j] dp[i][j][k]=(2j+1)dp[i1][j][k2j]+(j+1)(j+1)dp[i1][j+1][k2j]+dp[i1][j1][k2j]

等式的右边共有三项
下标:不妨观察最后一项,表示新考虑的 R i , T i R_i, T_i Ri,Ti都没有在当前考虑的范围内 1 ∼ n 1 \sim n 1n存在匹配,而 d p [ i − 1 ] [ j − 1 ] [ k − 2 j ] dp[i-1][j-1][k-2j] dp[i1][j1][k2j]之所以可以转移到 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]是因为新考虑的 i i i由于没有找到匹配,根据 j j j的定义, j + = 1 j+=1 j+=1, 而 k + = 2 j k+=2j k+=2j的理解推荐结合这篇文章中数交点的方法,十分直观。

系数:第一项表示新考虑的 R i R_i Ri T i T_i Ti与尚未匹配的动物进行匹配或者 R i R_i Ri T i T_i Ti匹配,共 ( 2 ∗ j + 1 ) (2*j + 1) (2j+1)种组合,进而解释了其系数的含义。第二项表示新考虑的 R i R_i Ri T i T_i Ti与尚未匹配的动物进行匹配, ( j + 1 ) ∗ ( j + 1 ) (j+1)*(j+1) (j+1)(j+1)种组合,也解释了第二项系数的合理性。第三项由于不设计新考虑的 R i R_i Ri T i T_i Ti的匹配问题,故系数为 1 1 1.

参考

文献

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值