題目傳送門
蛤蛤蛤蛤……高三真是狗……
(別問我開學第一周怎麼度過的我不想說……)
看到題目首先想到乙個dp,dp[
i][j
]dp[i][j]
dp[i][
j]表示放在第i
ii行第j
jj列的可行方案數,於是就有如下轉移辣:
d p[
i][j
]=∑k
=j+1
mdp[
i−1]
[k]i
∈[2,
n],j
∈[1,
m]
dp[i][j]=\sum\limits_^dp[i-1][k] \ \ \ \ i\in[2,n],j\in[1,m]
dp[i][
j]=k
=j+1
∑md
p[i−
1][k
]i∈[
2,n]
,j∈[
1,m]
答案就是:
a ns
=∑i=
1mdp
[n][
i]
ans=\sum\limits_^dp[n][i]
ans=i=
1∑m
dp[n
][i]
初狀態是:
d p[
1][i
]=1i
∈[1,
m]
dp[1][i]=1 \ \ \ \ i\in [1,m]
dp[1][
i]=1
i∈[1
,m]應該比較好理解吧……車不能與其他車放置在同行和同列,還必須要求每個車的左上不能有其他車。
不過棋盤的放置是不確定的,可以n
nn作為行也可以m
mm作為行,所以把n
nn和m
mm反過來再dp一遍。發現有時候n
nn作為行無解有時候m
mm作為行無解,有解時n
n<
m,所以dp一遍就好了。
這樣隨便乙個o(n
m2
)o(nm^2)
o(nm2)
的dp就出來了,可是……過不去……
那麼找找優化方法,注意到第二行的dp類似於對第一行做了個字首和,每一行與前一行都錯開一位做字首和處理,所以那個dp式子中代價o(m
)o(m)
o(m)
的求和就可以優化一下……
列個表看一下,其實dp方程就被優化成了這樣:
d p[
i][j
]=dp
[i][
j+1]
+dp[
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]=d
p[i]
[j+1
]+dp
[i−1
][j+
1]i∈
[2,n
],j∈
[1,m
]如果學過選修2-3,就會看出這和組合數很類似啊……
( n+
1m)=
(nm)
+(nm
−1
)\binom=\binom+\binom
(mn+1
)=(m
n)+
(m−1
n)具體證明……這個數學老師應該講了吧……(我忘了……)
這個dp時間複雜度是o(n
m)
o(nm)
o(nm
)的,不過打一下表,發現這就是把楊輝三角順時針旋轉了90∘
90^\circ
90∘,要求的值,即最後一行的和,其實就是楊輝三角中一列的和,要求的答案在楊輝三角中可以表示為:
a ns
=∑i=
1m−1
(n−1
i)
ans=\sum\limits_^\binom
ans=i=
1∑m−
1(i
n−1
)這個求和還是數學課上講過……可以化簡為(nm
)n\choose m
(mn)……
所以優化了一堆,就是求個組合數咯……輸出最後50位……
至於n
n<
m,將dp陣列轉置的時候自然是m
m<
n,所以有m
>
nm>n
m>
n的情況只需把棋盤轉一下,轉成合法情況放置再轉回去,就是對應的合法情況咯……
有意思的題……
時間複雜度o(n
log
2log2
n+50n
log2n
)o(n\log_2 \log_2 n+50n\log_2n)
o(nlog2
log2n
+50n
log2n
)?xbb別當真……
code
BZOJ4498 魔法的碰撞(組合數學 dp)
傳送門 首先我們發現乙個排列,2個魔法使之間一定要填max di,di 1 1max d i,d 1 max di di 1 1個格仔而如果總共一定要填的為k kk個,貢獻就是 l kn n l k 考慮dpdp dp出每種情況的方案數 首先按d dd從大到小排序消除max maxma x我們發現乙...
BZOJ 4767 兩雙手(組合數學 Dp)
description 老w是個棋藝高超的棋手,他最喜歡的棋子是馬,更具體地,他更加喜歡馬所行走的方式。老w下棋時覺得無聊,便 決定加強馬所行走的方式,更具體地,他有兩雙手,其中一雙手能讓馬從 u,v 移動到 u ax,v ay 而另一雙手能讓 馬從 u,v 移動到 u bx,v by 小w看見老w...
bzoj1008 越獄 組合數學
監獄有連續編號為1 n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入兩個整數m,n.1 m 10 8,1 n 10 12 可能越獄的狀態數,模100003取餘 2 366種狀態為 000 001 ...