ACWing 327 玉公尺田(狀態壓縮dp入門)

2021-10-08 19:12:25 字數 1387 閱讀 5638

農夫約翰的土地由m*n個小方格組成,現在他要在土地裡種植玉公尺。

非常遺憾,部分土地是不育的,無法種植。

而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。

現在給定土地的大小,請你求出共有多少種種植方法。

土地上什麼都不種也算一種方法。

輸入格式

第1行包含兩個整數m和n。

第2…m+1行:每行包含n個整數0或1,用來描述整個土地的狀況,1表示該塊土地肥沃,0表示該塊土地不育。

輸出格式

輸出總種植方法對100000000取模後的值。

資料範圍

1≤m,n≤12

輸入樣例:

2 31 1 1

0 1 0

輸出樣例:

9思路:dp(i,j)表示已經種了i行且第i列的狀態為j,狀態為為二進位制表示,1表示種0則沒種,先預處理出合法的狀態,再處理出每種合法狀態可以由哪種狀態轉移來。每行壞掉的土地位置取1,記錄出每行壞土地的二進位制數p,之後列舉每行的每種狀態時,當合法狀態j與p相與若結果不為零,說明在某個壞土地上也進行了種植,則此狀態也應該跳過。dp(m+1,0)就是最終答案,種了m+1行且最後一行沒種。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

ll mod =

1e8;

int m,n;

int dp[15]

[10000];

int p[15]

;vector<

int> num,head[

10000];

bool

check

(int x)

return

true;}

intmain()

}for

(int i=

0;i<

1<)for

(int i=

0;isize()

;i++

)for

(int j=

0;jsize()

;j++

) dp[0]

[0]=

1;for(

int i=

1;i<=n+

1;i++)}

} cout<[0

]

cin>>ab;

}

AcWing 327 玉公尺田 狀態壓縮動態規劃)

農夫約翰的土地由 m times n 個小方格組成,現在他要在土地裡種植玉公尺。非常遺憾,部分土地是不育的,無法種植。而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。注意 這裡是上下左右邊緣,不是兩斜對角邊緣 現在給定土地的大小,請你求出共有多少種種植方法。土地...

狀壓DP 玉公尺田

農夫約翰的土地由m n個小方格組成,現在他要在土地裡種植玉公尺。非常遺憾,部分土地是不育的,無法種植。而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。現在給定土地的大小,請你求出共有多少種種植方法。土地上什麼都不種也算一種方法。輸入格式 第1行包含兩個整數m和n...

狀態壓縮DP 玉公尺田

農夫約翰的土地由m n個小方格組成,現在他要在土地裡種植玉公尺。非常遺憾,部分土地是不育的,無法種植。而且,相鄰的土地不能同時種植玉公尺,也就是說種植玉公尺的所有方格之間都不會有公共邊緣。現在給定土地的大小,請你求出共有多少種種植方法。土地上什麼都不種也算一種方法。輸入格式 第1行包含兩個整數m和n...