1. 程式人生 > >對狀壓dp的一點理解

對狀壓dp的一點理解

博主是初學者,以下僅代表個人觀點,若有錯誤歡迎指出。

狀壓dp

      此dp可以理解為最暴力的dp,因為他需要遍歷每個狀態,所以將會出現2^n的情況數量,所以明顯的標誌就是資料不能太多(好像是<=16?),然後遍歷所有狀態的姿勢就是用二進位制來表示,01串,1表示使用,0表示未使用,就把所有的狀態投射到很多二進位制的數上(類似於hash?)然後對每個狀態找一"些"狀態的方法如下程式碼,即狀壓dp的精髓!!!

補充:對位運算要熟練,位運算很重要!位運算很重要!位運算很重要!

for(s=1;s<(1<<n);s++)
{
     for(i = n-1 ; i >=0;i--)
    {       
        tem=1<<i;        //  1在某一位,其它位為0
        if(tem & s)         //判斷是否能由此種狀態達到,即判斷當前位是1還是0
        {
            past=s-tem;     //當前位的1變為0即為上一狀態
        }    
    }         
}