POJ 2411 位压缩dp
来源:互联网 发布:js 调用windows程序 编辑:程序博客网 时间:2024/05/22 12:06
参考:http://blog.csdn.net/woshi250hua/article/details/7952496
状态转移方程:dp[i+1][k]=sum(dp[i][j]);对于每一行,因为最多有11列,所以最多有2^11=2048个状态,由于一行的状态只受前一行状态的影响,因此关键是j如何才能转向k。本题目采用的是插头dp,如果某个位置为0表示该位置是一个插头,可以将木块竖着放。否则,必须有连续偶数个1才行。
边界条件:可以将第0行预设为全是1,终态为最后一行全部为1,dp[h][2^w-1]。
程序中,枚举每个状态是否可行。另,交换h,w是的h<=w会使速度更快。
//11217061c00h00g2411Accepted580K860MSG++937B2013-01-28 18:06:34#include<stdio.h>#include<stdlib.h>#include<string.h>int h,w;__int64 dp[12][2048];int isOk(int from,int to){ for(int i=0;i<w;i++){ int x=from&(1<<i); int y=to&(1<<i); if(!x&&!y) return 0; if(x&&y){ i++; if(i==w) return 0; if((from&(1<<i))==0) return 0; if((to&(1<<i))==0) return 0; } } return 1;}int main(){ while(scanf("%d%d",&h,&w)!=EOF){ if(h==0&&w==0) break; if(h%2&&w%2) { printf("0\n");continue;} int Max=(1<<w)-1; memset(dp,0,sizeof(dp)); dp[0][Max]=1; for(int i=0;i<h;i++) for(int j=0;j<=Max;j++) if(dp[i][j]) for(int k=0;k<=Max;k++) if(isOk(j,k)) dp[i+1][k]+=dp[i][j]; printf("%I64d\n",dp[h][Max]); } return 0;}
- POJ 2411 位压缩dp
- poj 2411(压缩dp)
- poj-2411-状态压缩DP
- poj 2411 状态压缩dp
- poj 2411 状态压缩DP
- POJ 2411 状态压缩DP
- poj 2411 状态压缩dp
- poj 2411 状态压缩dp
- POJ 2411 状态压缩DP
- POJ 2411 状态压缩DP
- poj 2411 (状态压缩dp)
- poj 2411 状态压缩dp
- POJ 2411 状态压缩DP
- poj 炮兵阵地 状态压缩DP + 位运算
- POJ 3628 Bookshelf 2(状态压缩DP+位运算)
- poj 2411 状态压缩DP 铺砖块
- poj 2411 状态压缩dp+轮廓线
- POJ 2411 铺地砖 状态压缩dp入门
- linux内核中的likely和unlikely
- 关于Java中多线程死锁的代码示例
- iphone中键盘的显示和隐藏
- java 直接选择排序算法
- KeilC如何通过linker将文件放入指定存储地址
- POJ 2411 位压缩dp
- [面试] 进程和线程的区别(面试题)
- Linux C进程与多线程入门—(2)等待进程
- Android Activity去除标题栏和状态栏
- 从键盘接收一个整数,并用递归求其阶乘
- java单例模式
- JS--命名空间的理解(namespace)
- 字体问题
- java求输入两个数的最大公约数和最小公倍数