poj 3254 Corn Fields 简单状压dp

来源:互联网 发布:sql 新增列 默认值 编辑:程序博客网 时间:2024/05/23 19:19

点击打开链接

#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int M = 380;const int Mod=100000000;long long dp[20][M]; // dp[i][j] 前i行的方法数 && 第i行的排放为J int n,m,snum; int map[M];//题目所给的图转化成数字 作用:不该放的放不了  图:1010 决策 1011 显然第三个位置不能放 淘汰该决策 int state[M];void Init(){snum=0; // 单行的合法个数 for(int i=0;i<4096;i++) //2^12{if(!(i&i<<1)){state[snum++]=i;}} }int main(){Init();cin>>n>>m;for(int i=1;i<=n;i++){map[i]=0;for(int j=1;j<=m;j++){int x;cin>>x;if(x==1){map[i]+=(1<<(m-j+1)); //第i行的地图 }}}memset(dp,0,sizeof(dp));for(int j=0;j<snum;j++) //第一行 {if(state[j]&(~map[1]))continue;dp[1][j]++;}for(int i=2;i<=n;i++){for(int j=0;j<snum;j++){for(int k=0;k<snum;k++){if(state[j]&(~map[i])) //infertile不能放 continue;if(!(state[j]&state[k])) //当前行和上一行不能矛盾 dp[i][j]=(dp[i][j]+dp[i-1][k])%Mod; //当前行只与上一行有关 }}}long long ans=0;for(int j=0;j<snum;j++){ans=(ans+dp[n][j])%Mod;}cout<<ans<<endl;return 0;}


0 0
原创粉丝点击