jzoj 1266 玉公尺田(狀壓dp)

2021-08-21 12:46:41 字數 1481 閱讀 3015

description

農民 john 購買了一處肥沃的矩形牧場,分成m*n(1 <= m <= 12; 1 <= n <= 12)個格仔。他想在那裡的一些格仔中種植美味的玉公尺。遺憾的是,有些格仔區域的土地是貧瘠的,不能耕種。精明的 fj 知道奶牛們進食時不喜歡和別的牛相鄰,所以一旦在乙個格仔中種植玉公尺,那麼他就不會在相鄰的格仔中種植,即沒有兩個被選中的格仔擁有公共邊。他還沒有最終確定哪些格仔要選擇種植玉公尺。    作為乙個思想開明的人,農民 john 希望考慮所有可行的選擇格仔種植方案。由於太開明,他還考慮乙個格仔都不選擇的種植方案!請幫助農民 john 確定種植方案總數。

input

line 1: 兩個用空格分隔的整數 m 和 n

lines 2..m+1: 第 i+1 行描述牧場第i行每個格仔的情況, n 個用空格分隔的整數,表示 這個格仔是否可以種植(1 表示肥沃的、適合種植,0 表示貧瘠的、不可種植)

output

line 1: 乙個整數: fj 可選擇的方案總數 除以 100,000,000 的餘數。

sample input

2 3

1 1 1

0 1 0

sample output

分析:設f[i][j]為第i行狀態為j時的方案數,f[i][j]=sum(f[i-1][k]) 其中j&k==0且j,k為合法狀態。

**

#include 

#include

#include

#define n 20

#define m 10000

#define mo 100000000

#define ll long long

using

namespace

std;

int n,m;

ll ans,bin[n],a[n][m],b[n][m],f[n][m];

bool v[n];

void dfs(int x,int s,int now)

if (a[now][x]&&!v[x-1])

dfs(x+1,s,now);

}int main()

for (int i=1;i<=b[1][0];i++)

f[1][b[1][i]]=1;

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

for (int j=1;j<=b[i][0];j++)

for (int k=1;k<=b[i-1][0];k++)

if ((b[i][j]&b[i-1][k])==0) f[i][b[i][j]]=(f[i][b[i][j]]+f[i-1][b[i-1][k]])%mo;

for (int i=1;i<=b[n][0];i++)

ans=(ans+f[n][b[n][i]])%mo;

printf("%lld",ans);

fclose(stdin);

fclose(stdout);

}

狀壓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 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...

玉公尺田 狀壓DP 記搜

乙個n m role presentation n m n m的矩陣裡,有幾個是可以種植玉公尺的。求玉公尺種植不相連的方案數。dfs爆搜 只 能拿90分,正解是狀壓dp。可以把可種植玉公尺的土地用1表示,貧瘠的土地用0表示,每一行串成的數字就是乙個二進位制數,狀態壓縮後,就成了乙個較小的十進位制數。...