POJ3254 Corn Fields 状态压缩动态规划,状压动规
2014-08-21 18:32
483 查看
/* 题目:POJ3254 注释中非特别说明则为2进制 Memory还可以更小,因为state和f开大了 可使用状态远少于1<<N, 所以这题开600其实就稳过 */ #include<cstdio> #include<cstring> #include<algorithm> #define N 15 #define mod 100000000 using namespace std; int m,n,p,ans; int state[1<<N],f [1<<N],map ; void init() { ans=p=0; memset(f,0,sizeof(f)); memset(map,0,sizeof(map)); } int check_match(int a,int b) { if(a&b)return 0; /*每一位和其前一位检验(&使每一位前移)*/ return 1; } void init_state() { int i,total=1<<n;/*每行有total种状态 */ for(i=0;i<total;i++) { /*检测该状态是否合理(该状态表示行是否有俩牛挨着)*/ if(check_match(i,i<<1))state[++p]=i; } } int check(int floor,int x)/*行数为floor,状态为x*/ { /*某位map[k]为1,x也为1,表示不让放,你还放,只有这种情况return 0;*/ if(x&map[floor])return 0; return 1; } int main() { int i,j,k,t; while(scanf("%d%d",&m,&n)!= EOF) { init(); init_state(); /*map:处理地图,某位为0表示能放牛*/ for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { scanf("%d",&t); if(t==0)map[i]+=(1<<(n-j)); } } /*处理边界,即对第一行进行状态地图匹配*/ for(i=1;i<=p;i++) { if(check(1,state[i])) { f[1][i]++; } } for(i=2;i<=m;i++) { for(j=1;j<=p;j++) { /*状态与地图进行匹配,此处不需要进行预处理(O相同)*/ if(check(i,state[j])) { /*j为此行状态,k为上一行状态*/ for(k=1;k<=p;k++) { /*如果两状态上下之间不冲突则进行转移*/ if(check_match(state[j],state[k])) { f[i][j]+=f[i-1][k]; f[i][j]%=mod; } } } } } for(i=1;i<=p;i++) { ans+=f[m][i]; ans%=mod; } printf("%d\n",ans); } }
相关文章推荐
- poj 3254 Corn Fields(动态规划:状压DP)
- POJ3254 Corn Fields(状态压缩)
- POJ 1185 炮兵阵地(动态规划+状态压缩)
- POJ 3254 Corn Fields (状态压缩DP)
- poj3254 Corn Fields (状态压缩dp)
- POJ-3254 Corn Fields 入门级状态压缩DP
- POJ3254——Corn Fields(状态压缩DP)
- POJ 3254 Corn Fields (状态压缩DP)
- POJ 3254 Corn Fields(状态压缩DP)
- poj 3254 Corn Fields_状态压缩dp
- 炮兵阵地(poj1185,状态压缩的动态规划)
- 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
- poj 3254 Corn Fields (状态压缩DP)
- POJ 3254 Corn Fields【状态压缩】
- poj 3254 Corn Fields(状态压缩dp)
- poj 3254 Corn Fields(状态压缩DP)