奇怪的道路
?
DeepinC的題解
考場AC nb%%%%%%%%%%%%%%%%%%
2019/4/27
Day1? T3 奇怪的道路
step1:復雜度分析
1<= n <= 30, 0 <= m <= 30, 1 <= K <= 8.
按照習慣,正解復雜度一般在1e6-1e8級別
而且往往復雜度關系最大的就是最小的那個數
對,抓住那個k=8打
所以說先蒙個復雜度
O(mnk)?太小
O(mn*2^k)這個差不多
所以試試狀壓?
step2:算法
算法一:
其實看到這么小的數據范圍應該也能 <感受一下> 狀壓的氣息吧
[任何一個城市都與恰好偶數條道路相連(0也被認為是偶數)]
奇數偶數?可以用0,1,兩種狀態表示,這很狀壓,這非常狀壓
設dp[n][m][state]表示已經考慮了n個城市,m條道路,所有城市狀態為state時的情況數
如果你把n和p連起來,n-k<=p<n????? (pow[i]表示2的i次方)
則
?? ?dp[n][m][state]+=dp[n][m-1][state^pow[n]^pow[p]];
異或超棒的,當你連上一條路時,兩個端點已經連上的路原來是奇數的就變成偶數,偶數就變成奇數
題庫里內存128M,考試時內存256M,state太占內存,大概能處理n=15,一半分
算法二:(優化)
我說過那個最小的k是突破口吧?但是用上了嗎?
根據復雜度分析,如果把那個2^n替換成2^k就可以了
那么就要把state的位數變成k,仔細一看,剛好合適
那么state的含義稍微一變:最后k座城市的狀態
<交線牛逼法>很好啊,因為第i座城市的狀態轉移只與最后k座城市有關
<NOI2019 Day2 T1 mentor:中國好碼農>ing...
碼出來的時候,忽然發現一個問題,我沒考慮當前城市的情況,所以state的大小其實是2^(k+1)
<王鶴松式>沒關系沒關系,復雜度更接近上限了,正確的可能性更高了(玄學信仰)
狀態轉移的式子稍微一改
?? ?dp[n][m][state]+=dp[n][m-1][state^1^pow[n-p]];
而且因為state的表示范圍在變化,所以對于每個n,dp值都需要特殊轉移
?? ?dp[n][m][(state<<1)&(pow[k+1]-1)]+=dp[n-1][m][state];
dp[n][m][0]即為答案
算法三:(無關緊要的優化)
時間小優化:
?? ?我是個聽學長話的乖孩子。。。。。。
?? ?他說過,取模超級慢的是嘛?
?? ?怎么避免取模呢?減法優于取模,判斷優于計算
?? ?inline long long mod(long long k){return k>=1000000007?k-1000000007:k;}
?? ?因為代碼里只存在加法,所以計算結果不會超過1000000007*2,減去一個1000000007就行了
空間大優化:
?? ?為什么只有256M啊?NOI還有5G呢
?? ?可見,dp式子只從n-1轉移到n
?? ?滾動數組!棒!
?? ?式子再稍微一改
?? ??? ?dp[i&1][j][s]=mod(dp[i&1][j][s]+dp[i&1][j-1][s^1^pow[i-p]]);
?? ??? ?dp[(i&1)^1][j][s<<1]=dp[i&1][j];
?? ?滾起來別忘了清空數組
?? ??? ?dp[i&1][j][s]=0;
編號 ?? ?題目 ?? ?狀態 ?? ?分數 ?? ?總時間 ?? ?內存 ?? ?代碼 / 答案文件 ?? ?提交者 ?? ?提交時間
#57153 ?? ?
#C. 奇怪的道路
?? ?Accepted ?? ?100 ?? ?67 ms ?? ?616 KiB ?? ?C++11 / 754 B ?? ?DeepinC (吳迪) ?? ?2019-04-27 21:46:34
20個測試點,時間還不錯
k=8的話目測可以處理m=n=300;
代碼
?
轉載于:https://www.cnblogs.com/znsbc-13/p/11268465.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 奶茶店的双皮奶怎么做
- 下一篇: 好听唯美小清新的网名133个