poj3254 狀態壓縮DP

2021-06-28 06:36:45 字數 1068 閱讀 999

全程精講

農夫有一塊地,被劃分為m行n列大小相等的格仔,其中一些格仔是可以放牧的(用1標記),農夫可以在這些格仔裡放牛,其他格仔則不能放牛(用0標記),並且要求不可以使相鄰格仔都有牛。求方案數

#include #include using namespace std;

#define mod 100000000

int m,n,top = 0;

//top表示每行最多的狀態數

int state[600],num[110];

//state存放每行所有的可行狀態(即沒有相鄰的狀態

int dp[20][600];

//dp[i][j]:對於前i行資料,每行有前j種可能狀態時的解

//~8:應該表示 對於前i行資料,當前i行用j狀態時的解(因為狀態轉移方程--)

int cur[20];

//cur[i]表示的是第i行整行的情況

//、、、果然還是一步步親自除錯才能明白

inline bool ok(int x)

void init()

}inline bool fit(int x,int k)

/*line34-36

(其實我不知道這在說什麼--也不打算知道)

此處,注意要用相反儲存的資料來判斷,

因為若10101001是一種可行狀態,則可知101001也可行(是前者的一部分)

這時x即為10101001,cur[k]為10110,x&cur[k]=0,即符合條件

*/int main()

}for(int i = 1;i <= top;i++)}/*

狀態轉移過程中,dp[i][k] =sigma dp[i-1][j] (j為符合條件的所有狀態)

*/for(int i = 2; i <= m; ++i)}}

int ans = 0;

for(int i = 1; i <= top; ++i)

printf("%d\n",ans);

}}

POJ 3254 (狀態壓縮DP)

思路 狀態壓縮dp,用二進位制位的1表示放了,0表示沒有放。設dp i j 表示第i行狀態為j時,前i行的方案數,狀態轉移方程就是 dp i j dp i 1 k j與k這兩個狀態不衝突。最後答案就是dp n 1.top 之和。include include include include incl...

poj3254 狀態壓縮dp

題意 乙個n m的矩陣,每個格仔是0或者1,1表示土壤肥沃可以種植草地,0則不可以。在種草地的格仔可以放牛,但邊相鄰的兩個格仔不允許同時放牛,問總共有多少種放牛的方案 不放牛也算一種情況 思路 狀態壓縮 感覺不大像dp。dp i j 表示第i行狀態為j時符合條件的方案數 我們可以先求出一行的所有可行...

POJ3254(狀態壓縮DP)

與poj1185類似,不過這裡每一行的狀態只收前一行影響,所以用 f i t 表示第 i 行狀態為 stk t 時的總方案數,那麼根據加法原理,f i t f i t f i 1 j j 表示第 i 1 行所有合法的切與狀態 stk t 不相鄰的狀態,記得取模。還有就是對每一行的狀態判斷是否合適,就...