题目传送门
蛤蛤蛤蛤……高三真是狗……
(别问我开学第一周怎么度过的我不想说……)
看到题目首先想到一个DP,
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示放在第
i
i
i行第
j
j
j列的可行方案数,于是就有如下转移辣:
d
p
[
i
]
[
j
]
=
∑
k
=
j
+
1
m
d
p
[
i
−
1
]
[
k
]
i
∈
[
2
,
n
]
,
j
∈
[
1
,
m
]
dp[i][j]=\sum\limits_{k=j+1}^{m}dp[i-1][k] \ \ \ \ i\in[2,n],j\in[1,m]
dp[i][j]=k=j+1∑mdp[i−1][k] i∈[2,n],j∈[1,m]
答案就是:
a
n
s
=
∑
i
=
1
m
d
p
[
n
]
[
i
]
ans=\sum\limits_{i=1}^{m}dp[n][i]
ans=i=1∑mdp[n][i]
初状态是:
d
p
[
1
]
[
i
]
=
1
i
∈
[
1
,
m
]
dp[1][i]=1 \ \ \ \ i\in [1,m]
dp[1][i]=1 i∈[1,m]
应该比较好理解吧……車不能与其他車放置在同行和同列,还必须要求每个車的左上不能有其他車。
不过棋盘的放置是不确定的,可以
n
n
n作为行也可以
m
m
m作为行,所以把
n
n
n和
m
m
m反过来再DP一遍。发现有时候
n
n
n作为行无解有时候
m
m
m作为行无解,有解时
n
<
m
n<m
n<m,所以DP一遍就好了。
这样随便一个
O
(
n
m
2
)
O(nm^2)
O(nm2)的DP就出来了,可是……过不去……
那么找找优化方法,注意到第二行的DP类似于对第一行做了个前缀和,每一行与前一行都错开一位做前缀和处理,所以那个DP式子中代价
O
(
m
)
O(m)
O(m)的求和就可以优化一下……
列个表看一下,其实DP方程就被优化成了这样:
d
p
[
i
]
[
j
]
=
d
p
[
i
]
[
j
+
1
]
+
d
p
[
i
−
1
]
[
j
+
1
]
i
∈
[
2
,
n
]
,
j
∈
[
1
,
m
]
dp[i][j]=dp[i][j+1]+dp[i-1][j+1]\ \ \ \ i\in[2,n],j\in[1,m]
dp[i][j]=dp[i][j+1]+dp[i−1][j+1] i∈[2,n],j∈[1,m]
如果学过选修2-3,就会看出这和组合数很类似啊……
(
n
+
1
m
)
=
(
n
m
)
+
(
n
m
−
1
)
\binom{n+1}{m}=\binom{n}{m}+\binom{n}{m-1}
(mn+1)=(mn)+(m−1n)
具体证明……这个数学老师应该讲了吧……(我忘了……)
这个DP时间复杂度是
O
(
n
m
)
O(nm)
O(nm)的,不过打一下表,发现这就是把杨辉三角顺时针旋转了
9
0
∘
90^\circ
90∘,要求的值,即最后一行的和,其实就是杨辉三角中一列的和,要求的答案在杨辉三角中可以表示为:
a
n
s
=
∑
i
=
1
m
−
1
(
n
−
1
i
)
ans=\sum\limits_{i=1}^{m-1}\binom{n-1}{i}
ans=i=1∑m−1(in−1)
这个求和还是数学课上讲过……可以化简为
(
n
m
)
n\choose m
(mn)……
所以优化了一堆,就是求个组合数咯……输出最后50位……
至于
n
<
m
n<m
n<m,将DP数组转置的时候自然是
m
<
n
m<n
m<n,所以有
m
>
n
m>n
m>n的情况只需把棋盘转一下,转成合法情况放置再转回去,就是对应的合法情况咯……
有意思的题……
时间复杂度
O
(
n
log
2
log
2
n
+
50
n
log
2
n
)
O(n\log_2 \log_2 n+50n\log_2n)
O(nlog2log2n+50nlog2n)?xbb别当真……
Code