玉公尺田 狀壓DP 記搜

2022-09-03 06:48:11 字數 1773 閱讀 9281

乙個n×

m' role="presentation">n×m

n×m的矩陣裡,有幾個是可以種植玉公尺的。求玉公尺種植不相連的方案數。

dfs爆搜 只 能拿90分,正解是狀壓dp。

可以把可種植玉公尺的土地用1表示,貧瘠的土地用0表示,每一行串成的數字就是乙個二進位制數,狀態壓縮後,就成了乙個較小的十進位制數。 設f

[i][

j]' role="presentation">f[i

][j]

f[i]

[j]表示在第

i' role="presentation">i

i行,狀態壓縮後的十進位制數為

j' role="presentation">j

j的情況下,總共種植的方案數。那麼,若

k' role="presentation">kk&

j=j' role="presentation">j=j

j=j,那麼說明在上一行的種植情況為

k' role="presentation">k

k時,這一行種植情況為

j' role="presentation">j

j是合法的(即沒有兩個玉公尺種植位置相連)。那麼f[

i][j

]' role="presentation">f[i

][j]

f[i]

[j]就與

f[i−

1][k

]' role="presentation">f[i

−1][

k]f[

i−1]

[k]可以成立,f[

i][j

]+=f

[i−1

][k]

' role="presentation">f[i

][j]

+=f[

i−1]

[k]f

[i][

j]+=

f[i−

1][k

]。 最終答案就是∑i

=02m

−1f[

n][i

]' role="presentation">∑2m

−1i=

0f[n

][i]

∑i=0

2m−1

f[n]

[i]。

#include 

#include

#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);

using

namespace

std;

int n,m,a[21][21],g[21],f[21][5001],ms,num[41],sum;

bool state[5001];

int main()

ms=num[m+1]; //2^m

for (int i=0;i1)&i))&&(!((i>>1)&i))); //初始化

f[0][0]=1;

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

for (int j=0;jif (state[j]&&((j&g[i])==j)) //為j的情況合法

for (int k=0;kif (!(j&k)) //k在上一行的情況合法

f[i][j]+=f[i-1][k];

for (int j=0;j100000000;

return

printf("%d\n",sum)&0;

}

狀壓DP 玉公尺田

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

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...

jzoj 1266 玉公尺田(狀壓dp)

description 農民 john 購買了一處肥沃的矩形牧場,分成m n 1 m 12 1 n 12 個格仔。他想在那裡的一些格仔中種植美味的玉公尺。遺憾的是,有些格仔區域的土地是貧瘠的,不能耕種。精明的 fj 知道奶牛們進食時不喜歡和別的牛相鄰,所以一旦在乙個格仔中種植玉公尺,那麼他就不會在相...