6-3 德玛西亚万岁

状压dp板子。。。

#include <bits/stdc++.h>
using namespace std;
const int mod = 100000000;
int n, m;
int a[15][15];
int b[13][1<<12];
int ans[13][1<<12];
int f(int i, int j){           //f(i, j) 表示第i行为状态j时,不合法时输出-1
    for (int k=1;k<=m;k++)  if (!a[i][k] && ((j>>(m-k))&1))    return -1;
    for (int k=1;k<=m;k++)  if (((j>>(m-k))&1) && ((j>>(m-k+1))&1))   return -1;
    return 0;
}
int main(){
    while (cin >> n >> m){
        memset (ans, 0, sizeof ans);
        int res = 0;
        for (int i=1;i<=n;i++)  for (int j=1;j<=m;j++)
            cin >> a[i][j];
        for (int i=1;i<=n;i++)    for (int j=0;j<(1<<m);j++)
            b[i][j] = f(i, j);
        for (int j=0;j<(1<<m);j++)  if (b[1][j]!=-1)
            ans[1][j] = 1;
        for (int i=2;i<=n;i++)    for (int j=0;j<(1<<m);j++)    if (b[i][j]!=-1){
            for (int k=0;k<(1<<m);k++)  if (b[i-1][k]!=-1){
                if (j&k)    continue;
                ans[i][j] = (ans[i][j]+ans[i-1][k])%mod;
            }
        }
        for (int j=0;j<(1<<m);j++)
            res = (res+ans[n][j])%mod;
        cout << res << endl;
    }
    return 0;
}

0 条评论

发表评论

邮箱地址不会被公开。