poj 3254 Corn Fields 状态压缩dp

2015-07-20 17:10:32 · 作者: · 浏览: 3

题意:

给一块m行n列的土地,有一些格可以种树,另外一些不可以,树不能相邻,问一共有多少种种法。

分析:

从后往前种,子问题向父问题扩展,当种到某一格时只有他和他后面的n-1个格子的情况对它有影响,故对这n个格子进行编码为状态S,表示种完(多米诺骨牌那题是放置前,注意区别,都可行)这n个格子的状态。父问题由稍小子问题逐步解决,正是动态规划的思想。

代码:

//poj 3254
//sep9
#include 
  
   
using namespace std;
const int maxN=14;
const int mod=100000000;
int land[maxN][maxN];
int dp[2][1<
   
    =0;--i) for(j=n-1;j>=0;--j){ for(used=0;used<1<
    
     >j&1) nxt[used]=0; else{ nxt[used]=cur[used]; nxt[used]+=cur[used|(1<
     
      >j&1)&&(used>>(j+1)&1)){ res=0; }else if(!(used>>j&1)&&(used>>(j+1)&1)){ res=cur[used]; res+=cur[used|(1<
      
       >j&1)&&!(used>>(j+1)&1)){ res=cur[used&(~(1<
       
        >j&1)&&!(used>>(j+1)&1)){ res=cur[used]; res+=cur[used|(1<