poj3254 狀態壓縮dp

2021-07-04 03:16:35 字數 1335 閱讀 8817

題意:乙個n*m的矩陣,每個格仔是0或者1,1表示土壤肥沃可以種植草地,0則不可以。在種草地的格仔可以放牛,但邊相鄰的兩個格仔不允許同時放牛,問總共有多少種放牛的方案(不放牛也算一種情況)

思路:狀態壓縮(感覺不大像dp。。)dp[i][j]表示第i行狀態為j時符合條件的方案數

我們可以先求出一行的所有可行狀態以十進位制存到v_status陣列中, 然後再排除。

接下來輸入土地狀態的時候需要取反存到r_status陣列中,為的是,如果某乙個可行狀態與當前行進行&操作後,如果不為0,那麼表示在1的位置上放了牛,但是此時的1狀態是真實中0,就是不能放置(因為之前取反了),所以如果&操作後是0,表示這個狀態可以在此行出現,之後再遍歷下一行的所有可行狀態,並且與當前行的狀態&操作也不為1

狀態壓縮就是為了方便計算將二進位制轉成十進位制處理

**:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)

#define mem1(a) memset(a,-1,sizeof(a))

#define mem(a) memset(a,0,sizeof(a))

#define ss(a,b) scanf("%d%d",&a,&b)

#define s(a) scanf("%d",&a)

#define inf 0x3f3f3f3f

#define w(a) while(a)

#define pi acos(-1.0)

#define ll long long

#define eps 10e-9

#define n 100010<<1

#define mod 100000000

using namespace std;

void mys(int& res)

void myp(int a)

/*************************the end of template************************/

int v_status[600], r_status[600];

bool judge1(int x)

bool judge2(int i, int j)

int dp[13][600];

void solve(int m, int top){

for(int i=2; i<=m; i++){

for(int j=1; j

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

全程精講 農夫有一塊地,被劃分為m行n列大小相等的格仔,其中一些格仔是可以放牧的 用1標記 農夫可以在這些格仔裡放牛,其他格仔則不能放牛 用0標記 並且要求不可以使相鄰格仔都有牛。求方案數 include include using namespace std define mod 10000000...

POJ3254(狀態壓縮DP)

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