hiho 9 狀態壓縮二

2021-07-07 01:56:21 字數 1449 閱讀 1886

歷經千辛萬苦,小hi和小ho終於到達了舉辦美食節的城市!雖然人山人海,但小hi和小ho仍然抑制不住興奮之情,他們放下行李便投入到了美食節的活動當中。美食節的各個攤位上各自有著非常多的有意思的小遊戲,其中乙個便是這樣子的:

小hi和小ho領到了乙個大小為n*m的長方形盤子,他們可以用這個盒子來裝一些大小為2*1的蛋糕。但是根據要求,他們一定要將這個盤子裝的滿滿的,一點縫隙也不能留下來,才能夠將這些蛋糕帶走。

這麼簡單的問題自然難不倒小hi和小ho,於是他們很快的就拿著蛋糕離開了~

但小ho卻不只滿足於此,於是他提出了乙個問題——他們有多少種方案來裝滿這個n*m的盤子呢?

值得注意的是,這個長方形盤子的上下左右是有區別的,如在n=4, m=3的時候,下面的兩種方案被視為不同的兩種方案哦!

動態規劃的本質是列舉,只是將列舉的中間結果記錄下來,從而減少列舉的次數。另外,動態規劃一般解決多階段決策問題,首先應該搞清楚問題的階段,例如01揹包,對每個物體決定拿或不拿就是乙個決策階段,然後從最後乙個決策階段出發,即在最後乙個物品,決定拿或不拿的時候,如果拿,那麼我們需要知道dp(i-1, x-ci

)是多少,如果不拿我們需要知道dp(i-1, x)是多少,然後才能通過計算知道拿或者不拿,這樣的思考過程中我們就得到了需要記錄的狀態。同時也得到了狀態轉移公式,一般dp問題都是反著想,然後正著算。

對於這個問題,我們首先想到最笨的列舉方法:從左上角開始,從左到右,從上到下依次將所有的格仔擺上蛋糕,注意到每個格仔處可以選擇橫著擺或者豎著擺,所以每個格仔就是乙個階段,而且前面格仔的擺放方式對後面格仔有影響,但是每次擺放只會影響到自己所在行和下一行,如果現在我們在第乙個格仔處橫著擺,然後將前兩行的狀態記錄下來,再遞迴求解在此狀態下後面的可能性;如果再在第乙個格仔處豎著擺,記錄下前兩行的狀態,再遞迴求解之後的狀態數,至此將兩種情況的個數相加就可以得到總個數了。所以我們的狀態變數為dp(i, j, p1

,p2.

.pm,

q1,q

2,..

.qm ) 表示第i行之前都已放滿,第i,和第i+1行分別按照p1

pm和q1q

m 的方式擺放,之後會有多少種擺放方式。狀態轉移就是在保證填滿且不重複擺放的前提下,對i,j處的擺放進行列舉,然後求和,下面的程式使用記憶化搜尋的方式,使得程式簡練。

狀態壓縮就是p,q使用二進位制表示。

#include 

#include

#include

enum ;

int dp[maxn][maxm][maxm2][maxm2];

int n, m;

int f(int i, int j, int cur, int

next)

else

}else

if (i+1

next&(1

}return dp[i][j][cur][next];

}}int main()

狀態壓縮 二 Hiho9 Hihocoder

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

狀態壓縮二 (hiho 1048)

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

hiho 1048 狀態壓縮2

題目大意 用1x2的單元拼接出 nxm的矩形,單元可以橫放或者縱放,n 1000,m 5.求不同的拼接方案總數。分析 實現 include include include using namespace std define bit i,j i 1 j 1 const int mod 1000000...