POJ3254 Corn Fields
第一道状态压缩DP。。。。入门题 按照自己的思路来 AC了
先把每行可行的状态求出来 再进行DP
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int mod=100000000; int dp[13][5000], map[13][13], state[13][1005], len[13]; int main() { int n, m, i, j, k; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&map[i][j]); for(i=0;i<n;i++) len[i]=1, state[i][0]=0; int tmp; for(i=0;i<n;i++) { for(j=0;j<m;j++) { tmp=len[i]; for(k=0;k<len[i];k++) { if((j==0||!(1<<(j-1)&state[i][k]))&&map[i][j]) { state[i][tmp++]=state[i][k]|(1<<j); } } len[i]=tmp; } } memset(dp,0,sizeof(dp)); int s1, s2; for(i=0;i<len[0];i++) { dp[0][state[0][i]]=1; } for(i=1;i<n;i++) { for(j=0;j<len[i];j++) { s1=state[i][j]; for(k=0;k<len[i-1];k++) { s2=state[i-1][k]; if(!(s1&s2)) { dp[i][s1]=(dp[i][s1]+dp[i-1][s2])%mod; } } } } int ans=0; for(i=0;i<len[n-1];i++) { s1=state[n-1][i]; ans=(ans+dp[n-1][s1])%mod; } printf("%d\n",ans); } return 0; }