hiho 1048 狀態壓縮2

2021-09-08 18:19:52 字數 1023 閱讀 3394

題目大意

用1x2的單元拼接出 nxm的矩形,單元可以橫放或者縱放,n < 1000, m <= 5. 求不同的拼接方案總數。

分析

實現

#include#include

#include

using

namespace

std;

#define bit(i, j) (i & (1 << (j - 1)))

const

int mod = 1000000007

;int dp[1005][5][35][35

];/*

記憶化搜尋

n,m為邊界n行,m列。

求第i行,第j列位置開始擴充套件,且第i行的占用狀態為s1, 第i+1行的占用狀態為s2 時,填滿剩餘的空格的方案總數

*/int dfs(int n, int m, int i, int j, int s1, int

s2)//

動歸陣列, dp2[i][k1][k2] 表示前i-1行都已經填滿了,此時第i行的占用情況的二進位制表示轉換為十進位制為 k1,

//第i+1行的占用情況的二進位制表示轉換為十進位制為 k2

int dp2[1005][35][35

];int

main()

}if (i < n) //

看是否可以縱向擴充套件

//當前的第i+1行的占用情況

for (int k2 = 0; k2 < mx; k2++)}}

}//當第i行全部被占用滿時,可以將第i+1行的狀態 轉移到 i+1行的當前行

for (int k = 0; k < mx; k++)

}//最後的結果是n行全部佔滿,此時第n行為 mx-1, 第n+1行為0

printf("

%d\n

", dp2[n][mx-1][0

]);

return0;

}

狀態壓縮二 (hiho 1048)

題意 給出乙個n m的矩形格仔,用2 1的塊去填滿塊的方案數。2 n 1000,3 m 5 思路 由於m比較小,可以用位對其進行記錄,矩形內1 1的格仔的狀態有 橫著的開始,橫著的結尾,豎著的開始,豎著的結尾,所以用0,1,2,3 來分別進行表示,這樣用乙個2bit即可。為了加速,先把不可能的一些狀...

每日一題之 hiho1048 狀壓dp

程式設計之美的課後題也有乙個和整個題目一樣的。p269 題目這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓...

hiho 9 狀態壓縮二

歷經千辛萬苦,小hi和小ho終於到達了舉辦美食節的城市!雖然人山人海,但小hi和小ho仍然抑制不住興奮之情,他們放下行李便投入到了美食節的活動當中。美食節的各個攤位上各自有著非常多的有意思的小遊戲,其中乙個便是這樣子的 小hi和小ho領到了乙個大小為n m的長方形盤子,他們可以用這個盒子來裝一些大小...