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表示,每一行串成的數字就是乙個二進位制數,狀態壓縮後,就成了乙個較小的十進位制數。...