題目和**源自
/*
狀態壓縮的核心:講每一行的狀態用二進位制來表示,然後轉換成乙個十進位制數字,
如果有m列,那麼狀態就有2^m個狀態,那麼就可以用0--2^m-1的數字來表示這些狀態,
一般情況下,m不得超過32位
一、先在dp裡面準備好第一行的狀態
針對這道題來說,如果用豎著的瓷磚來鋪的話,我們把下面的位置記做一,上面的位置記做零,
如果是橫著鋪的,那麼後乙個位置一定為1,
二、從第二行開始,以後每一行是否可行要依據前一行的狀態
*//*狀態壓縮dp******填充地板 */
#include
#include
#include
using
namespace
std;
#define nmax 1000
#define mmax 1<<5
bool testfirstline(int j, int m) // 主要用來測試第一行的相容性
return
true;
}bool testcompatible(int statesa, int statesb, int m) // 判斷下一行狀態statea與上一行狀態stateb的相容性
i++;
} else
//狀態a為1
else i += 2;
} }
return
true;
} int main()
int allstates = 1
<< m;
long
long f[nmax][mmax];
int i,j;
memset(f, 0, sizeof(f));
for(j = 0; j < allstates; j++)
} int k;
//第i行每種狀態與多少種i-1的每種狀態相容
for(i = 1; i < n; i++)
} }
} //為什麼最後一行的最後乙個狀態就是答案呢?
//因為最後一行必定全部都為一,如果存在某一列不為1,則這種狀態不符合條件
cout
<< f[n-1][allstates-1]<< endl;
return
0;
}
狀態壓縮動態規劃
動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...
動態規劃 狀態壓縮
這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...
狀態壓縮動態規劃
我們可以使用乙個01串a來表示乙個集合。對於數x x 0 用ax 0表示它不在該集合中,用ax 1表示它在該集合中。將01串a看作是乙個二進位制數,我們把它轉換為十進位制,就可以使用乙個十進位制整數來表示乙個實際使用二進位制方式表示的集合。這樣,我們可以使用位運算方便地處理集合的操作。交集兩個集合a...