這次訓練總結是12月8日到12月10日。
狀壓DP專題今天就結束了。目前是22/26,本來是打算做完24題的。。。看來是完不成了。今晚還準備把其中一道AC自動機+狀壓DP的題目做出來(看的資料裡有這道題),這道題的思路十分巧妙,把五維數組巧妙地壓縮成了二維,是另一種壓縮狀態的方法。具體的等做出來再說吧。。。
總結一下狀壓DP:
剛開始以為就是利用二進位壓縮狀態,01表示有無,後來發現它其實是一種方法,二進位壓縮只屬於其中的一種。不過二進位壓縮的確非常好用,也是巧妙地利用了位元運算。
解決的題目主要是狀態數比較少,但是無法開那麼大的數組的問題。
可以直接用幾重for迴圈完成狀態轉移,也可以利用dfs。但是用dfs做了放木塊的題目以後,幾乎再也沒遇到用dfs來狀態轉移的題目。而且自己做放1*3的木塊的時候還爆了一次記憶體。。。有些題目需要預先處理合法的狀態,有些題目需要先求出最短路,有的題目要用浮點數,有的題目需要求一個數二進位狀態所含1的數目,貼一段覺得比較不錯的代碼:
int fcount(int x)
{
int s=0;
while(x){
s++;
x&=(x-1);
}
return s;
}
有的題目需要控制精度,有的題目
另外,還學會了string可以直接加字母,學會了滾動數組i&1,學會了用異或^,這裡貼上刪迴文數刪到完那道題的狀態轉移的代碼:
for(i=0;i<m;i++)
{
for(k=(i+1)|i;k<m;k=(k+1)|i)//k狀態一定包含i狀態
{
if (b[k^i]&&dp[i]!=-1)//k^i 就是刪除的那個串
{if (dp[k]<0)dp[k]=dp[i]+1;
else dp[k]=min(dp[k],dp[i]+1);
}
}
}
連連看的狀態比較奇特,用10個二進位位表示當前的位置到接下來連續10個水果的狀態,1為已經消除,0為未消除。然後二進位最後一位表示當前水果狀態,然後看看能不能刪到完。
另外,還有兩道期望dp(跑去看了資料,簡單的學習了下),兩道AC自動機+狀壓DP,目前只做出了一道,同時自己用這幾天的時間主攻了AC自動機,基本應用基本解決,再多做幾道題鞏固一下,寫幾道題解。
接下來這幾天主要做一些AC自動機的題目鞏固學習一下,下一個專題暫訂機率dp和期望dp,插頭dp看了一些資料沒怎麼看懂,可能看完AC自動機直接看尾碼數組。
另外,數位dp沒有白學,今天的比賽D題幾乎是數位DP專題中數字計數的原題。。。B題也很快做出來了,最坑的是A題讀錯題了。。沒做出來。。。懂題意後秒A。。。虧死了。。。讀題還是大問題。。。
加油。。。enjoy my ACM life。