POJ 3254 Corn Fields (状态压缩DP)

原创 2013年12月04日 20:14:07

题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(一头牛都不放也是一种方案)

思路:dp[i][s] 代表第i行状态为s(s是每个位置放与不放组成的0-1序列对应的十进制数)时所能得到的方案总数

递推方程:dp[i][s] = Σdp[i-1][f]  (f为i-1行的状态)

判断状态合法的方案是,s中不能有相邻的1,s中的1必须满足题目给定矩阵,即矩阵有1的地方s可以放1,s与f不能在同一位置有1。

初始化:dp[1][s] = 0或1(代表第一行状态为s是否合法)

#include<cstring>
#include<cstdio>
#define mod 1000000000
int stk[400],top,N,M,a[15][15],dp[15][400];
inline bool checkline(int i,int x)
{
    for(int j=0,pre=0;j<M;++j,pre=x&1,x/=2)
        if(x&1 && !a[i][j+1]) return 0;
    return 1;
}
inline bool checkline(int x)
{
    for(int j=0,pre=0;j<M;++j,pre=x&1,x/=2)
        if(x&1 && pre) return 0;
    return 1;
}
void init()
{
    memset(dp,0,sizeof(dp));
    top=0;
    for(int s=0;s< (1<<M) ;++s)
        if(checkline(s)) stk[top++]=s;
}
int main()
{
    while(~scanf("%d%d",&N,&M))
    {
        for(int i=1;i<=N;++i)
        for(int j=1;j<=M;++j) scanf("%d",&a[i][j]);
        init();
        for(int j=0;j<top;++j) dp[1][j]=checkline(1,stk[j]);
        for(int i=2;i<=N;++i)
        for(int j=0;j<top;++j)
        {
            if(!checkline(i,stk[j])) continue;
            for(int k=0;k<top;++k)
            {
                if((stk[j]&stk[k]) || !checkline(i-1,stk[k])) continue;
                dp[i][j] = (dp[i][j]%mod+dp[i-1][k]%mod)%mod;
            }
        }
        int ans=0;
        for(int j=0;j<top;++j)
            ans = (ans%mod+ dp[N][j]%mod)%mod;
        printf("%d\n",ans);
    }
    return 0;
}




状态压缩dp入门 (poj3254 Corn Fields)

题目链接:http://poj.org/problem?id=3254 题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多...
  • y990041769
  • y990041769
  • 2014年04月28日 19:10
  • 19549

Poj - 3254 Corn Fields (状态压缩dp入门第一题(详解

题目大意:农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的(用1标记),农夫可以在这些格子里放牛,其他格子则不能放牛(用0标记),并且要求不可以使相邻格子都有牛。现在输入数据给出...
  • u011044871
  • u011044871
  • 2014年04月08日 11:38
  • 2821

POJ3254:Corn Fields(状态压缩)

Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤...
  • libin56842
  • libin56842
  • 2014年05月04日 23:15
  • 2344

Poj 3254 Corn Fields 状态压缩

题意:在一些有草的地方放牛,并且相邻的不能放牛,问放牛的方案数 思路:定义以一个dp[i][j],代表第i行第j种状态下所获得的方案数 ,注意位运算 代码: #include #inclu...
  • acm18810549519
  • acm18810549519
  • 2013年10月04日 17:32
  • 393

poj 3254 Corn Fields(状态压缩)

#include #define MOD 100000000 int d[13][13]; int dp[13][1
  • sky_zdk
  • sky_zdk
  • 2017年03月27日 20:48
  • 447

Poj 3254 Corn Fields(状态压缩)

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8291   Ac...
  • acm_BaiHuzi
  • acm_BaiHuzi
  • 2014年11月10日 19:42
  • 438

POJ 3254 Corn Fields (状态压缩DP)

题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案)。 分析:方格边长范围只有12,用状态压缩dp好解决。 预处理:每一行的障碍用一个...
  • paradiserparadiser
  • paradiserparadiser
  • 2013年08月16日 21:55
  • 624

POJ 3254 Corn Fields(状态压缩dp)

Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ ...
  • desire_ing
  • desire_ing
  • 2014年08月06日 22:30
  • 315

Corn Fields POJ - 3254 状态压缩dp入门

#include   #include     const int mod = 100000000;    int st[1 int map[1            ...
  • labixiaoxinliuxinmei
  • labixiaoxinliuxinmei
  • 2017年08月15日 20:52
  • 65

poj 3254 Corn Fields dp状态压缩

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11536   Accepted: 604...
  • major_zhang
  • major_zhang
  • 2017年09月04日 21:00
  • 84
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3254 Corn Fields (状态压缩DP)
举报原因:
原因补充:

(最多只允许输入30个字)