洛谷P1879 [USACO06NOV]玉米田Corn Fields

状压DP

题目传送门

因为 n , m 均很小,因此我们可以考虑状压。
f[i][j] 表示第 i 行状态为 j 时的方案数。
转移方程:

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

当且仅当 j k 均满足题目所给条件。

代码:

#include
#include
#include
#define MAXN 12
#define MAXM 1<<13
#define MOD 100000000
using namespace std;
int n,m;
int dp[MAXN+5][MAXM+5],f[MAXN+5],f1[MAXM+5];
int main(){
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++){
            int x;
            scanf("%d",&x);
            f[i]+=((1&x)<1);//第一个判定条件
        }
    for (int i=0;i<(1<1&i)&&!(i>>1&i));//第二个判定条件
    dp[0][0]=1;//全空也算一个
    for (int i=1;i<=n;i++)
        for (int j=0;j<(1<if (f1[j]&&(j&f[i])==j)//如果j满足条件
                for (int k=0;k<(1<if (!(j&k))//如果k也满足条件
                        dp[i][j]=(dp[i][j]+dp[i-1][k])%MOD;//更新
    long long ans=0;
    for (int i=0;i<(1<//得出答案
    printf("%lld\n",ans);
    return 0;
}

你可能感兴趣的:(洛谷,DP---状压DP,蒟蒻zxl的Blog专栏)