神仙題。但是難得的傻孩子cbx沒有喊題解,所以也就難得的自己想出來了乙個如此神仙的題。
如果是自己想的,說它神仙是不是有點不合適啊。。?
反正的確不好像。關鍵就在於這個標籤。頹完標籤就差不多會了。
%%%cbx那麼快就想出來了。(2個小時?)
廢話多了。
先考慮暴力。對於16的資料範圍當然要考慮狀壓,狀態表示每乙個位置是否要放兵。
我們只需要考慮左邊對右邊,上邊對下邊的貢獻,最後把答案×2即可。
然後列舉每一層的狀態,逐層轉移即可。
複雜度是$o((2^)^2 \times c \times r)$,9e12左右
我想到乙個沒什麼用的優化,既然你已經知道了本層的士兵數量,那麼那些狀態裡不合法的就不用列舉了。
預處理一下,複雜度是$o((c_c^)^2 \times c \times r)$,極端情況3e11左右
但是不要想了,一分也不會多的。
1 #include2 #include3 #include4 #include5用作對拍的t40using
namespace
std;
6int r,c,num[129],dp[2][1048577],re[1048577][17],loc[1048577][17],scnt[1048577
],ans;
7char s[129][18
];8 vectorv[17];9
int cal(int ro,int lst,int
tst)
15int
main()//
printf("%d\n",v[1][0]);
26for(int i=1;i<=r;++i)
31for(int i=0;i<=v[num[r]].size();++i)ans=max(ans,dp[r&1
][v[num[r]][i]]);
32 printf("
%d\n
",ans<<1);//
printf("%d\n",cal(2,1,1));
33 }
複雜度的瓶頸明顯就在於$c_^8$或者$2^$的平方上,狀壓肯定是少不了的但是平方不能有。
也就是必須一次只列舉乙個狀態進行轉移。
找這題的特殊性質,如果依次考慮每個格仔,那麼dp值是否增加只與左邊一位和上邊的一位有關。
所以你列舉上面的一整層是多餘的。
我們只要知道這一位自身,左邊和上面是誰就好了,其餘位置並不在意。
而這一位填完之後,上面的那一位就作廢了,取而代之的是這一位。。。
所以我們的狀態表示的就是當前輪廓線上的每一位有沒有放數。。。
具體實現還是比較簡單的。需要修改二進位制下的某一位,判斷二進位制下某一位左右各有幾個1(知道是第幾個就可以判斷它到底是誰了)
乙個打成函式,乙個預處理。
複雜度$o(2^c \times c \times r)$
注意乾掉不合法的狀態(一行完畢之後發現它填數的個數不夠或者是多了)
1 #include2 #include3 #include4view codeusing
namespace
std;
5char s[129][18];int n,m,dp[2][65538],cntl[65538][18],cntr[65538][18],ans,l[129];6
int chg(int st,int p,int
w)12
intmain()//
return 0;
20int nw=1,ls=0;memset(dp[nw],0xa0,sizeof dp[nw]);dp[nw][0]=0;21
for(int i=1;i<=n;++i)
30//
for(int s=0;s<1<31}32
for(int st=0;st<1
//int j=m;for(int s=0;s<1<34}35
for(int i=0;i<1
36 printf("
%d\n
",ans*2);//
printf("%d\n",chg(1,3,1));
37 }
沒有cbx說的那麼好寫好調。
他給出的小的容易出鍋的樣例:
2 1 a a
2 2 a a
3 3 ab aa ba(這個是我出鍋的)
輪廓線DP 專項
題意 n m n mn m n,m 11 的矩陣,填1 2 1 21 2或2 12 1 2 1方塊,求方案數 解析 以前寫過狀壓的做法,直接一行一行維護,現在寫輪廓線的做法 注意 當前填紅點的意思是,以紅點作為方塊的右下角 因為方塊長度為2,所以對紅點位置有三種操作 向上填 為了使所有方塊填滿,如果...
插頭DP 輪廓線DP
題解 p5056 模板 插頭dp gnaq uparrow 學習資料,大部分賀的,有一些些的改動與自己的補充 插頭 dp 是一類用狀壓 dp 來處理連通性問題的 dp 方法。常見的型別 棋盤插頭 dp 連通性問題 迴路問題,路徑問題,生成樹問題等 插頭 dp 本質上式狀壓 dp!一般設 dp i,s...
大樓輪廓線
輸入第一行乙個數表示有n座大樓,後面依次輸入n行,每一行表示大樓的起始點,終點和高度,輸出為大樓輪廓資訊 如下圖 第一行輸出為3 後面有三行輸入表示大樓的資訊 第二行為 1 3 3 第三行為 2 4 4 第三行為 5 6 1 輸出大樓輪廓資訊 第一行 1 2 3 第二行 2 4 4 第三行 5 6 ...