问题重现
原题链接
设
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:=∑∣pi−i∣
求满足
O
d
d
n
e
s
s
=
k
Oddness = k
Oddness=k的不同排列
P
P
P的数量。
数据范围
- 输入均为整数
- 1 ≤ n ≤ 50 1 \leq n \leq 50 1≤n≤50
- 0 ≤ k ≤ n 2 0 \leq k \leq n^2 0≤k≤n2
样例
Input
3 2 |
---|
Output
2 |
---|
思路
这里以官方题解为基础,加以翻译并解释。
若存在一组兔子( R 1 ∼ R n R_1\sim R_n R1∼Rn)和一组海龟( T 1 ∼ T n T_1 \sim T_n T1∼Tn),请问有多少种方式可以形成 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 R1∼Ri与 T 1 ∼ T i T_1 \sim T_i T1∼Ti时,仍然有 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[i−1][j][k−2j]+(j+1)(j+1)dp[i−1][j+1][k−2j]+dp[i−1][j−1][k−2j]
等式的右边共有三项
下标:不妨观察最后一项,表示新考虑的
R
i
,
T
i
R_i, T_i
Ri,Ti都没有在当前考虑的范围内
1
∼
n
1 \sim n
1∼n存在匹配,而
d
p
[
i
−
1
]
[
j
−
1
]
[
k
−
2
j
]
dp[i-1][j-1][k-2j]
dp[i−1][j−1][k−2j]之所以可以转移到
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) (2∗j+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.