码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3254 Corn Fields 状态压缩DP

时间:2014-09-06 22:31:44      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   for   div   sp   log   

题目链接: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 false;//判断一行中,是否有两个相邻的1

    return true;//没有的话是一个合法的状态

}

 

void find()

{

    memset(ant,0,sizeof(ant));

    for(int i=0;i<(1<<m);i++)

    {

        if(ok(i))

        ant[k++]=i;

    }

}

 

int main()

{

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        for(int i=0;i<n;i++)

         for(int j=0;j<m;j++)

         {

             int tmp;

             scanf("%d",&tmp);

             if(tmp==0)map[i]=map[i]|(1<<j);//把第i行原始状态取反后放入map[i]

         }

         k=0;

         find();

         for(int i=0;i<k;i++)//初始化第一行状态

         if(!(ant[i]&map[0]))

         dp[0][i]=1;

         for(int i=1;i<n;i++)

         {

             for(int j=0;j<k;j++)

             {

                 if(map[i-1]&ant[j])continue;

                 for(int p=0;p<k;p++)

                 {

                     if((map[i]&ant[p])||(ant[p]&ant[j]))continue;

                     dp[i][p]=(dp[i][p]+dp[i-1][j])%MOD;

                 }

             }

         }

         int ans=0;

         for(int i=0;i<k;i++)

         ans=(ans+dp[n-1][i])%MOD;

         printf("%d\n",ans);

    }

}

 

POJ 3254 Corn Fields 状态压缩DP

标签:style   blog   http   color   io   for   div   sp   log   

原文地址:http://www.cnblogs.com/ltwy/p/3959873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!