poj 3254(状态压缩dp)
2013-08-24 11:11
363 查看
/* dp[i][k] =dp[i-1][j] //j状态可以到k状态 */ #include <stdio.h> #include <string.h> #define mod 100000000 int stk[500]; int cur[15]; int dp[15][500]; int m,n; int top; bool isok(int x) { if(x&(x<<1)) return 0; return 1; } void init() { top=0; for(int i=0;i<(1<<n);i++) { if(isok(i)) stk[++top]=i; } //printf("(top)%d\n",top); } bool match(int x,int k) { if(x&cur[k])return 0; return 1; } int main() { int x; while(scanf("%d%d",&m,&n)!=EOF) { init(); memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++) { cur[i]=0; for(int j=1;j<=n;j++) { scanf("%d",&x); if(x==0) cur[i]+=(1<<(n-j)); } } // for(int i=1;i<=m;i++) // { // printf("%d\n",cur[i]); // } for(int i=1;i<=top;i++) { if(match(stk[i],1)) dp[1][i]=1; } for(int i=2;i<=m;i++) { for(int k=1;k<=top;k++) { if(!match(stk[k],i)) continue; for(int j=1;j<=top;j++) { if(stk[k]&stk[j]) continue; if(!match(stk[j],i-1)) continue; dp[i][k] = (dp[i][k]+dp[i-1][j])%mod; } } } int ans=0; for(int k=1;k<=top;k++) { ans=(ans+dp[m][k])%mod; } printf("%d\n",ans); } return 0; }
相关文章推荐
- POJ 3254 压缩状态DP
- POJ 3254 Corn Fields(状态压缩DP)
- POJ —— 3254 Corn Fields(状态压缩dp)
- POJ 3254 Corn Fields【状态压缩DP】
- poj 3254 Corn Fields //状态压缩DP
- poj 3254 Corn Fields (状态压缩dp)
- [状态压缩DP] Poj 3254, Poj 1185
- 状态压缩DP 入门 POJ 3254
- (POJ 3254)Corn Fields <状态压缩DP 好题>
- 状态压缩DP-Corn Fields(POJ 3254)
- poj 3254 状态压缩dp
- POJ 3254 Corn Fields 状态压缩DP
- poj 3254 Corn Fields (状态压缩DP)
- poj 3254(状态压缩dp)
- POJ 3254 Corn Fields(DP + 状态压缩)
- poj 3254 Corn Fields_状态压缩dp
- poj 3254 Corn Fields_状态压缩dp
- poj 3254(状态压缩dp)
- poj 3254 状态压缩dp入门题
- POJ 3254 Corn Fields(状态压缩DP)