【状态压缩dp 入门】POJ
来源:互联网 发布:mac登录不了app store 编辑:程序博客网 时间:2024/05/20 16:40
Problem Description
给你一个h,w的矩阵,你可以使用1*2或者2*1的矩阵将其填满,问你有多少种情况。
参考博客:http://blog.csdn.net/shiwei408/article/details/8821853
pre,now的二进制代表一行怎么放。核心就是枚举出所有的pre->now的情况,然后用path[]数组存起来,然后跑h行,这一行为now这种二进制,有多少种情况,因为0代表着下一行,同样的列位肯定是1,所以最后一行不可能存在0.所以输出最后一行全为1的情况。也就是2^w - 1。
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn = 11;int path[(10*(1<<maxn))][2], cnt, h, w;//path得开大点,因为可能一个pre对应多个now,path用来存所有的pre对应now的情况long long dp[13][((1<<maxn))];//每个pre,now的二进制都对应着一种情况void dfs(int l, int now, int pre){ if(l > w) return; if(l == w)//填满一行 { path[cnt][0] = pre;//pre是上一行,now是当前行 path[cnt++][1] = now;//也就是如果pre是上一行,那么now就可以作为当前行 return ; } dfs(l + 2, (now<<2)|3, (pre<<2)|3);//上面是1,1下面1,1 dfs(l + 1, now<<1, (pre<<1)|1);//上面是1,下面是0 dfs(l + 1, (now<<1)|1, pre<<1);//上面是0,下面是1}int main(){ int i, j; while(~scanf("%d %d", &h, &w)) { if(!h && !w) break; if(h < w) swap(h, w);//我们让列比较小 cnt = 0; dfs(0, 0, 0); memset(dp, 0, sizeof(dp)); dp[0][(1<<w) - 1] = 1;//因为上面全为1的时候,下面可以是任意的情况 for(i = 0; i < h; i++) { for(j = 0; j < cnt; j++) { dp[i+1][path[j][1]] += dp[i][path[j][0]];//因为上一行是pre,下一行可以是now } } printf("%lld\n", dp[h][(1<<w) - 1]); } return 0;}
阅读全文
0 0
- 【状态压缩dp 入门】POJ
- POJ 2411 铺地砖 状态压缩dp入门
- poj 3254 状态压缩dp入门题
- 状态压缩DP 入门 POJ 3254
- POJ 3254 状态压缩DP入门
- 状态压缩DP 入门
- 状态压缩DP入门
- 状态压缩dp入门
- 状态压缩DP入门
- 状态压缩DP入门
- 状态压缩入门 POJ
- 状态压缩DP poj 2817 WordStack 入门题
- poj 2411 Mondriaan's Dream (状态压缩dp 入门)
- POJ 2817 WordStack 状态压缩DP 入门题
- 状态压缩dp入门 第一题 POJ 3254 Corn Fields
- POJ 3254 Corn Fields DP 状态压缩 入门
- Poj 1185 炮兵阵地(状态压缩dp 入门题)
- poj 3254 Corn Fields【状态压缩dp-入门】
- linux上安装mysql(rpm)
- 扩展方法&泛型的变化
- SqlMapConfig.xml文件配置 mybatis
- 内核层监控进程 线程 创建和销毁
- Selenium IDE使用的相关功能
- 【状态压缩dp 入门】POJ
- 模型数据升序排列(快排)
- web测试方法总结
- 第二章 重构原则
- 浅析Class类(反射机制原理)
- c语言读书笔记
- mapper.xml映射文件配置 mybatis
- canvas---canvas常用方法,绘制直线,矩形,文本,画图,曲线,createLinearGradient,translate,stroke,fillText
- hdu 4960 Another OCD Patient dp(记忆化搜索)