題目大意
用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的長方形盤子,他們可以用這個盒子來裝一些大小...