最近看题真的脑残了。。
1,结果忘记取模WA一次
2,结果忘记判断可不可存在WA了多次
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; #define MOD 100000000 #define ll __int64 ll dp[15][5001]; int map[15][15]; int main() { int n,m,i,j,k,l; while(~scanf("%d%d",&n,&m)) { memset(map,0,sizeof(map)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&map[i][j]); } } for(i=0;i<(1<<m);i++)dp[1][i]=1; for(i=1;i<n;i++) { for(j=0;j<(1<<m);j++) { int leap=0; for(k=1;k<=m;k++) { if(!map[i][k]&&(j&(1<<(k-1))))break; if(j&(1<<(k-1))) { leap++; } else leap=0; if(leap>=2)break; } if(k<=m)continue; for(k=0;k<(1<<m);k++) { for(l=0;l<m;l++) { if((j&(1<<l))&&(k&(1<<l)))break; } if(l<m)continue; dp[i+1][k]+=dp[i][j]; } } } ll ans=0; int leap=0; for(j=0;j<(1<<m);j++) { leap=0; for(k=1;k<=m;k++) { if(!map[n][k]&&(j&(1<<(k-1))))break; if(j&(1<<(k-1))) { leap++; } else leap=0; if(leap>=2)break; } if(k<=m)continue; ans+=dp[n][j]; } ans=ans%MOD; cout<<ans<<endl; } return 0; }