全程精講
農夫有一塊地,被劃分為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 不相鄰的狀態,記得取模。還有就是對每一行的狀態判斷是否合適,就...