ZOJ 1100 Mondriaan's Dream
来源:互联网 发布:js如何解析json数组 编辑:程序博客网 时间:2024/04/28 14:29
中等难度的DP。铺砖问题,有组合数学公式。 但是用搜索+dp的方法更……好吧,也很难做。
研究了一个下午的标程,终于搞懂。把每一层的砖块压缩为二进制编码,搜索上一层到当前层的状态转化是否能够达到。然后从0到11……11Dp。
void dfs ( int n, int from, int to ) 表示当前从左往右有n块砖,from表示前n块砖在这一层的编码,to表示下一层。修改了一下,使得1表示填满,0表示空位。标程里居然是01倒过来写的,我足足发呆了一个钟头。
其他没什么好说的,对于当前和下一层,每次放砖块只有三种可能:两横,竖放,竖放不下。横空就是两个竖放不下……
#include <cstdio>
#include <string>
double b[13][3000];
int tran[20000][2];
int H, W, maxMove, nTran;
void dfs ( int n, int from, int to )
...{
if ( n > W )
return;
if ( n == W )
...{
tran[nTran][0] = from;
tran[nTran ++][1] = to;
return;
}
dfs ( n + 2, ( from << 2 ) + 3, ( to << 2 ) + 3 );
dfs ( n + 1, ( from << 1 ) + 1, to << 1 );
dfs ( n + 1, from << 1, ( to << 1 ) + 1 );
}
void dp ()
...{
memset ( b, 0x00, sizeof ( b ) );
b[0][( 1 << W ) - 1] = 1;
int i, j;
for ( i = 0; i < H; i ++ )
for ( j = 0; j < nTran; j ++ )
b[i + 1][tran[j][1]] += b[i][tran[j][0]];
}
int main ()
...{
freopen ( "in.txt", "r", stdin );
while ( scanf ( "%d %d", &H, &W ) )
...{
if ( !H )
break;
int t;
if ( H < W )
...{
t = H; H = W; W = t;
}
nTran = 0;
dfs ( 0, 0, 0 );
//pt ();
dp ();
//pb ();
printf ( "%.0f ", b[H][( 1 << W ) - 1] );
}
return 0;
}
#include <string>
double b[13][3000];
int tran[20000][2];
int H, W, maxMove, nTran;
void dfs ( int n, int from, int to )
...{
if ( n > W )
return;
if ( n == W )
...{
tran[nTran][0] = from;
tran[nTran ++][1] = to;
return;
}
dfs ( n + 2, ( from << 2 ) + 3, ( to << 2 ) + 3 );
dfs ( n + 1, ( from << 1 ) + 1, to << 1 );
dfs ( n + 1, from << 1, ( to << 1 ) + 1 );
}
void dp ()
...{
memset ( b, 0x00, sizeof ( b ) );
b[0][( 1 << W ) - 1] = 1;
int i, j;
for ( i = 0; i < H; i ++ )
for ( j = 0; j < nTran; j ++ )
b[i + 1][tran[j][1]] += b[i][tran[j][0]];
}
int main ()
...{
freopen ( "in.txt", "r", stdin );
while ( scanf ( "%d %d", &H, &W ) )
...{
if ( !H )
break;
int t;
if ( H < W )
...{
t = H; H = W; W = t;
}
nTran = 0;
dfs ( 0, 0, 0 );
//pt ();
dp ();
//pb ();
printf ( "%.0f ", b[H][( 1 << W ) - 1] );
}
return 0;
}
- ZOJ 1100 Mondriaan's Dream
- zoj 1100 Mondriaan's Dream
- ZOJ 1100 Mondriaan's Dream
- zoj 1100 - Mondriaan's Dream
- ZOJ 1100 Mondriaan's Dream
- ZOJ 1100Mondriaan's Dream
- Mondriaan's Dream (zoj 1100 状压dp)
- ZOJ 1100 Mondriaan's Dream【状态压缩】【DP】【DFS】
- poj 2411 && zoj 1100 Mondriaan's Dream ———状态压缩dp
- zoj 1100&& poj2411 Mondriaan's Dream (dfs&&枚举&&状态压缩dp)好题
- [pku2411]Mondriaan's Dream
- POJ2411 Mondriaan's Dream
- POJ2411--Mondriaan's Dream
- POJ2411 Mondriaan's Dream
- poj2411 Mondriaan's Dream
- OpenJudge1413 Mondriaan's Dream
- openjudge Mondriaan's Dream
- Mondriaan's Dream POJ2411
- 好久不见
- DB2 隔离级别
- 10款宝宝最爱的家常辅食
- GWT 1.5出来了
- SOA 术语概述: 第 1 部分,服务、体系结构、治理和业务术语
- ZOJ 1100 Mondriaan's Dream
- SOA 术语概述,第 2 部分: 开发流程、模型和资产
- SOA 术语概述,第 3 部分: 分析和设计
- 启动proftp没有成功
- ASP分页显示
- HTTP协议分析
- ASP连接数据库的11种方法
- oracle对象类型的member方法
- perl python ruby groovy