problem description觀察本題,可以知道,下一行的可行方案,只與當前的可行方案有關。farmer john新買了一塊長方形的牧場,這塊牧場被劃分成m列n行(1<=m<=12;1<=n<=12),每一格都是一塊正方形的土地。fj打算在牧場上的某幾格土地裡種上美味的草,供他的奶牛們享用。遺憾的是,有些土地相當的貧瘠,不能用來放牧。並且,奶牛們喜歡獨佔一塊草地的感覺,於是fj不會選擇兩塊相鄰的土地,也就是說,沒有哪兩塊草地有公共邊。當然,fj還沒有決定在哪些土地上種草。 作為乙個好奇的農場主,fj想知道,如果不考慮草地的總塊數,那麼,一共有多少種種植方案可供他選擇。當然,把新的牧場荒廢,不在任何土地上種草,也算一種方案。請你幫fj算一下這個總方案數。
input
第1行: 兩個正整數 m 和 n ,用空格隔開
第2…m+1行: 每行包含 n 個用空格隔開的整數,描述了每塊土地的狀態。輸入的第 i+1 行描述了第 i 行的土地。所有整數均為 0 或 1 ,是 1 的話,表示這塊土地足夠肥沃, 0 則表示這塊地上不適合種草
output
第1行: 輸出乙個整數,即牧場分配總方案數除以100,000,000的餘數
sample input
2 31 1 1
0 1 0
sample output
9data constraint:
按下圖把各塊土地編號:
1 2 3
0 4 0
只開闢一塊草地的話,有4種方案:選1、2、3、4中的任一塊。
開闢兩塊草地的話,有3種方案:1、3 | 1、4 | 3、4
所以,可以運用狀態儲存的方法,將當前行某狀態的可行方案儲存下來,並進行轉移。
所以,對於函式 f[i][j] ,表示為第 i 行狀態為 j 的可行方案數。
狀態的表示可以運用位運算處理,類似之前的講解 比薩,一起奔跑吧
那麼,就有 f[i][j] = ∑ f[i-1][k] ( 狀態 k 可以轉移到狀態 j )
則,有如下**。
#include #include typedef long long ll ;
using namespace std;
int n,m;
int value[13];
int tot;
int x[380];
ll const mod = 100000000 ;
ll f[13][380],ans[13];
int main()
任務安排 動態規劃dp 狀態壓縮
馬上假期就要結束了,zjm還有 n 個作業,完成某個作業需要一定的時間,而且每個作業有乙個截止時間,若超過截止時間,一天就要扣一分。zjm想知道如何安排做作業,使得扣的分數最少。tips 如果開始做某個作業,就必須把這個作業做完了,才能做下乙個作業。有多組測試資料。第一行乙個整數表示測試資料的組數 ...
狀態壓縮動態規劃
動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...
動態規劃 狀態壓縮
這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...