您的位置:首页 > 其它

POJ 3254 Corn Fields

2018-04-27 22:00 260 查看

链接

思路

  状压dp,dp[i][j]:表示到第i行,状态为j的方案数。预处理出每一行所有的可能的选法。

  转移方程:dp[i][j] += d[i-1][k],j与k不冲突。

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>

using namespace std;

const int mod = 1e9;
int a[15][15],sta[15][10010],dp[15][10010];
int n,m;

inline int read() {
int x = 0,f = 1;char ch = getchar();
for (; !isdigit(ch); ch=getchar()) if(ch=='-') f=-1;
for (; isdigit(ch); ch=getchar()) x = x*10+ch-'0';
return x * f;
}

void getsta() {
int t = (1 << m) - 1;bool flag;
for (int i=1; i<=n; ++i) {
for (int j=0; j<=t; ++j) {
flag = true;
for (int k=0; k<m; ++k)
if (!a[i][m-k] && ((1<<k)&j)) {flag = false;break;}
if (!flag) continue;
if (j & (j<<1)) continue;
sta[i][++sta[i][0]] = j;
}
}
}
void getdp() {
for (int i=1; i<=sta[1][0]; ++i) dp[1][i] = 1; //dp[1][i] not dp[1][sta[1][i]]
for (int i=2; i<=n; ++i)
for (int j=1; j<=sta[i][0]; ++j)
for (int k=1; k<=sta[i-1][0]; ++k) {
if (sta[i][j] & sta[i-1][k]) continue;
dp[i][j] += dp[i-1][k];
if (dp[i][j] > mod) dp[i][j] %= mod;
}
int ans = 0;
for (int i=1; i<=sta
[0]; ++i) {
ans += dp
[i];
if (ans > 0) ans %= mod;
}
cout << ans;
}

int main() {
n = read(),m = read();
for (int i=1; i<=n; ++i)
for (int j=1; j<=m; ++j)
a[i][j] = read();
getsta();
getdp();
return 0;
}

 

http://poj.org/problem?id=3254

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: