poj 2663 Tri Tiling dp(矩形填充)
来源:互联网 发布:软件测试原则 编辑:程序博客网 时间:2024/04/30 15:24
#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algorithm>#include <iostream>using namespace std;#define LL long longconst int maxn=(1<<3)*3;//一个状态可以推出多个状态const int maxc=(1<<3)+2;int pre[maxn],now[maxn];LL dp[33][maxc];int m,n,t;void dfs(int num,int p,int q){ if(num>m)return; if(num==m) { pre[t]=q; now[t++]=p; return; } dfs(num+2,(p<<2)|3,(q<<2)|3); dfs(num+1,(p<<1)|1,q<<1); dfs(num+1,p<<1,(q<<1)|1);}int main(){ while(cin>>n) { int i,j,k; if(n==-1)break; m=3;t=0; dfs(0,0,0); memset(dp,0,sizeof(dp)); dp[0][(1<<m)-1]=1;//初始行的前行相当于,全都是横的方块 for(i=1;i<=n;i++) { for(j=0;j<t;j++) dp[i][now[j]]+=dp[i-1][pre[j]]; } cout<<dp[n][(1<<m)-1]<<endl;//最后行全都填满才算填满矩阵 } return 0;}/* 用1*2的方块填满n*m的矩阵,当n*m为奇数时,不可能成功。 由于填充方块可以横竖变换,所以n和m也可以交换 每行用二进制数表示状态,1为有方块,0为没方块(为了给下一行添加竖的方块) 一个横的方块用11表示,竖的是pre[i]=0,now[1]; pre[i],表示前一行的状态,now[i]表示在前一行的状态下,得到的下一行的状态; dp[i][now[j]]=dp[i-1][pre[j]]; 现在推状态: 前一行出现11,下一行填11 前一行出现1,下一行填0 前一行出现0,下一行填1(上一行有空位,所以必须用竖的方块填充) (注:前一行为1时,下一行不能填0,因为方块只有11和0) 之后用dfs找出所有的pre和now,接着就能dp了 这种方法只适用n和m小的情况才可以,有个数太大时需要用矩阵加速*/
和poj2411的作法一样,poj3420则需要矩阵加速
- poj 2663 Tri Tiling dp(矩形填充)
- poj 2663 Tri Tiling 状压dp
- poj 2663 Tri Tiling--状压dp
- poj 2663 Tri Tiling
- poj 2663 Tri Tiling
- POJ-2663-Tri Tiling
- poj 2663 Tri Tiling
- POJ-2663-Tri Tiling
- POJ 2663 Tri Tiling
- POJ 2663 Tri Tiling
- POJ 2663 Tri Tiling
- POJ 2663 Tri Tiling
- POJ: 2663 Tri tiling
- poj 2663 Tri Tiling(DP)
- POJ 2663 && HDU 1143 Tri Tiling(dp)
- 【POJ 2663】Tri Tiling(dp|递推)
- 1121. Tri Tiling (dp)
- poj 2663 Tri Tiling(递推)
- linux下svn命令使用总结
- 12岁的少年教你用Python做小游戏
- Linux系统编程学习之《进程环境》
- java.sql.Date类和java.util.Date类的使用
- centos配置dns服务器
- poj 2663 Tri Tiling dp(矩形填充)
- SQL Server 数据类型详解
- 卡巴斯基一年版 送序列号
- 动态规划求解编辑距离问题
- Java 调用C# webservice接口 生成java客户端 实现方式
- 为学Linux,我看了这些书
- CSS布局 — 根据内容是否自动伸缩展示区域的那些元素
- SQL Server最佳索引策略
- android与javascript相互调用