d
p
[
i
]
[
l
]
[
r
]
表
示
前
i
行
,
l
列
有
一
个
炮
,
r
列
有
两
个
炮
dp[i][l][r]表示前i行,l列有一个炮,r列有两个炮
dp[i][l][r]表示前i行,l列有一个炮,r列有两个炮
那么没有放置过的也就可以得到了
对于每一行我们都是有三种情况的:1.不放炮 2.放1个炮 3.放两个炮
对于不放置的情况,我们直接从上面一层拉过来即可:
d
p
[
i
]
[
l
]
[
r
]
+
=
d
p
[
i
−
1
]
[
l
]
[
r
]
dp[i][l][r]+=dp[i-1][l][r]
dp[i][l][r]+=dp[i−1][l][r]
如果放置一个的时候选择的列正好是没有放置过炮的:
d
p
[
i
]
[
l
]
[
r
]
+
=
d
p
[
i
−
1
]
[
l
−
1
]
[
r
]
dp[i][l][r]+=dp[i-1][l-1][r]
dp[i][l][r]+=dp[i−1][l−1][r]
如果放置一个的时候选择的列正好是放置了一个炮的:
d
p
[
i
]
[
l
]
[
r
]
+
=
d
p
[
i
−
1
]
[
l
+
1
]
[
r
−
1
]
dp[i][l][r]+=dp[i-1][l+1][r-1]
dp[i][l][r]+=dp[i−1][l+1][r−1]
如果放置两个的时候选择的列正好都是没有放置过炮的:
d
p
[
i
]
[
l
]
[
r
]
+
=
d
p
[
i
−
1
]
[
l
−
2
]
[
r
]
∗
C
(
m
−
l
+
2
−
r
,
2
)
dp[i][l][r]+=dp[i-1][l-2][r]*C(m-l+2-r,2)
dp[i][l][r]+=dp[i−1][l−2][r]∗C(m−l+2−r,2)
如果放置两个的时候选择的列正好都是放置了一个炮的:
d
p
[
i
]
[
l
]
[
r
]
+
=
d
p
[
i
−
1
]
[
l
+
2
]
[
r
−
2
]
∗
C
(
l
+
2
)
dp[i][l][r]+=dp[i-1][l+2][r-2]*C(l+2)
dp[i][l][r]+=dp[i−1][l+2][r−2]∗C(l+2)
如果放置两个的时候选择的列是放置一个炮和没有放置的:
d
p
[
i
]
[
l
]
[
r
]
+
=
d
p
[
i
−
1
]
[
l
]
[
r
−
1
]
∗
(
m
−
l
−
r
+
1
)
∗
l
dp[i][l][r]+=dp[i-1][l][r-1]*(m-l-r+1)*l
dp[i][l][r]+=dp[i−1][l][r−1]∗(m−l−r+1)∗l