poj 3254 Corn Fields_状态压缩dp
感谢:http://www.cnblogs.com/ka200812/archive/2011/08/11/2135607.html
让我搞懂了。
#include <iostream> #include <cstring> #include<cstdio> #include <vector> using namespace std; int n,m; int dp[13][2048]; vector<int>num[13]; void change(int i,int temp){ int j; for(j=0;j<(1<<m);j++){ if((j<<1)&j||(j>>1)&j) continue; if(j&temp) continue; num[i].push_back(j); } } int main(int argc, char** argv) { int i,j,temp,a,k,ans; while(scanf("%d%d",&n,&m)!=EOF){ for(i=1;i<=n;i++){ num[i].clear(); temp=0; for(j=1;j<=m;j++){ scanf("%d",&a); a=1-a; temp=temp*2+a; } change(i,temp); } memset(dp,0,sizeof(dp)); for(i=0;i<num[1].size();i++) dp[1][i]=1; for(i=2;i<=n;i++){ for(j=0;j<num[i].size();j++){ for(k=0;k<num[i-1].size();k++){ if(num[i][j]&num[i-1][k]) continue; dp[i][j]+=dp[i-1][k]; } } } ans=0; for(i=0;i<num[n].size();i++) ans=(ans+dp[n][i])%100000000; printf("%d\n",ans); } return 0; }
不怕路长,只怕心老.