状态压缩 poj 3254

n * m 个玉米

n*m个数字 0 或者1

1可以种玉米 0 不能  种玉米不能相邻

计算有几种 种的方法

#include<stdio.h>
#include<algorithm>
#include<string.h>

using namespace std;
#define MAXN 13
#define MAXN1 10000
#define mod 100000000
int n,m;
int z[MAXN][MAXN];
int num[MAXN1];
int cnt;
int dp[MAXN][MAXN1];  //dp[i][j]   第一维是行 第二维是列 表示这一行这个状态的数目
int x[MAXN]; //用来记录每一行的二进制数   1

void solve()                // 0&1 =0   就1&1=1
{
    for(int i=0;i<(1<<m);i++)   //所有可能的状态  就是这一行不可能相邻  10010  100100  这样可以  11010  110100  不行
        if((i&(i<<1))==0)
            num[cnt++]=i;
}
bool jug(int state,int r)  //这个状态 和这一行是否矛盾
{
    if(!(state&(~x[r])))
        return 1;
    return 0;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    scanf("%d",&z[i][j]);
            cnt=0;
            solve();
            memset(dp,0,sizeof(dp));
            memset(x,0,sizeof(x));
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                    if(z[i][j])
                        x[i]+=(1<<(m-j));
            }
            dp[0][0]=1;
            for(int i=1;i<=n;i++)
            {
                for(int st=0;st<cnt;st++)
                {
                    if(jug(num[st],i)) //这一行 和 这个状态
                    {
                        for(int pa=0;pa<cnt;pa++)
                        {
                            if(jug(num[pa],i-1)&&!(num[st]&num[pa]))//前一行和前一个状态 这和状态和前一个状态
                                dp[i][num[st]]+=dp[i-1][num[pa]];
                        }
                    }

                }
            }
            int ans=0;
            for(int i=0;i<cnt;i++)        //所有的数目要加一下
                ans=(ans+dp[n][num[i]])%mod;
            printf("%d\n",ans);
    }

    return 0;
}
时间: 2024-10-14 16:14:38

状态压缩 poj 3254的相关文章

POJ 3254 Corn Fields 状态压缩DP (C++/Java)

http://poj.org/problem?id=3254 题目大意: 一个农民有n行m列的地方,每个格子用1代表可以种草地,而0不可以.放牛只能在有草地的,但是相邻的草地不能同时放牛, 问总共有多少种方法. 思路: 状态压缩的DP. 可以用二进制数字来表示放牧情况并判断该状态是否满足条件. 这题的限制条件有两个: 1.草地限制. 2.相邻限制. 对于草地限制,因为输入的时候1是可以种草地的. 以"11110"草地分析,就只有最后一个是不可以种草的.取反后得00001  .(为啥取反

POJ 3254 Corn Fields 状态压缩DP

题目链接:http://poj.org/problem?id=3254 思路:状态压缩DP,状态方程为dp[i][j] += (dp[i-1][k]) code: #include <stdio.h> #include <string.h> #define N 500 const int MOD = 100000000; int dp[15][N],ant[N],n,m,k,map[15]; bool ok(int x) { if(x&(x<<1))return

poj 3254 Corn Fields ,状态压缩DP

题目链接 题意: 一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案(一头牛都不放也是一种方案) state[i] 表示对于一行,保证不相邻的方案 状态:dp[i][ state[j] ]  在状态为state[j]时,到第i行符合条件的可以放牛的方案数 状态转移:dp[i][ state[j] ] =Sigma dp[i-1][state'] (state'为符合条

POJ 3254. Corn Fields 状态压缩DP (入门级)

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yumm

poj 3254 Corn Fields(状态压缩dp)

Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares are infertile and

POJ 3254 【状态压缩DP】

题意: 给一块n*m的田地,1代表肥沃,0代表贫瘠. 现在要求在肥沃的土地上种草,要求任何两个草都不能相邻. 问一共有多少种种草的方法. 种0棵草也是其中的一种方法. n和m都不大于12. 思路: 状态压缩DP,dp[i][j]代表在第i行状态j一共有多少种可能的种植方法. j是二进制转化而来的状态,0代表不种草,1代表种草. dp[i]只受到两个限制,即dp[i-1]的某种状态,和当前土地的贫瘠状况. 只要保证&操作之后重复的为0就可以了 最后输出sum(dp[n][1...w])(w代表一共

POJ 3254 Corn Fields(状态压缩DP)

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yumm

[ACM] POJ 3254 Corn Fields(状态压缩)

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8062   Accepted: 4295 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yumm

状态压缩dp poj 3254 hdu5045

近来感觉状态压缩dp的强大性(灵活利用了二进制运算很关键)...于是做了俩提来看看..毕竟队友是专业的dp,我只是管中窥豹下而已..日后有机会再与之玩耍玩耍...ps:如果上天再给我一次机会,当年我愿意选择状态dp而不是网络流(只针对目前比赛出题潮流) 经典问题,不相邻/禁点方案数问题.poj3254 #include<iostream> #include<cstdio> using namespace std; int n,m; int dp[5000][15]; int yu[