博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PKU P2411 Mondriaan's Dream
阅读量:5080 次
发布时间:2019-06-12

本文共 3177 字,大约阅读时间需要 10 分钟。

PKU P2411 Mondriaan's Dream

题目描述:

Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use his toilet paper to draw on, for all of his paper was filled with squares and rectangles), he dreamt of filling a large rectangle with small rectangles of width 2 and height 1 in varying ways.

Expert as he was in this material, he saw at a glance that he'll need a computer to calculate the number of ways to fill the large rectangle whose dimensions were integer values, as well. Help him, so that his dream won't turn into a nightmare!

输入格式:

The input contains several test cases. Each test case is made up of two integer numbers: the height h and the width w of the large rectangle. Input is terminated by h=w=0.

输出格式:

For each test case, output the number of different ways the given rectangle can be filled with small rectangles of size 2 times 1. Assume the given large rectangle is oriented, i.e. count symmetrical tilings multiple times.

样例输入:

1 21 31 42 22 32 42 114 110 0

样例输出:

10123514451205

提示:

1<=h,w<=11

时间限制:1000ms

空间限制:256MByte


来源:PKU

 

这道题本来几个月前就应该做掉的,可是自己那时候太弱了,只有现在重新刷一下了。。。

结果自己写的方法和网上的题解感觉有些不一样,我是用已知的一行去推算下一行的情况;

注意(除第一行):如果一行中有1,这个1可能代表这两种情况,一种是横着放,一种是上面一排竖下来的(那么上面一排的这个位置肯定是0),所以转移的时候要注意下下;

记住,0永远只代表着从这行竖着向下放的方块!!!(前几个月这个一直没想清楚,还想用三进制的做,真是NAIVE)

#include
#define ll long longusing namespace std;ll n,m,f[16][1<<16];ll maxn;ll find(ll val){ ll t = 0; for(ll i=0;i
<< i; if(val & ce) t++; else { if(t & 1) return 0; t = 0; } } return 1;}ll check(ll now , ll down){ ll t = 0; for(ll i=0;i
<< i; if(down & ce) { if(now & ce) t++; else { if(t & 1) return 0; t = 0; } } else { if(!(now & ce)) return 0; if(t & 1) return 0; t = 0; } } if(t & 1) return 0; return 1;}int main(){ while(~scanf("%lld%d",&n,&m)) { if(!n && !m) return 0; if(n * m & 1) { cout<<0<
<< m; for(ll i=0;i

 

然后这个代码刚好跑过去,吓死我啦。

 

 

可是我有想了想,总觉得我这个代码还可以优化。

如果是从这一行推下一行的话,那么第一行为什么还要重新推一次呢?

直接从第〇行开始不就好了吗???

还是NAIVE 啊 啊啊!

于是我把我的代码删了一部分,修改一点点,真的的就一点点。。。

#include
#define ll long longusing namespace std;ll n,m,f[16][1<<16];ll maxn;ll check(ll now , ll down){ ll t = 0; for(ll i=0;i
<< i; if(down & ce) { if(now & ce) t++; else { if(t & 1) return 0; t = 0; } } else { if(!(now & ce)) return 0; if(t & 1) return 0; t = 0; } } if(t & 1) return 0; return 1;}int main(){ while(~scanf("%lld%d",&n,&m)) { if(!n && !m) return 0; if(n * m & 1) { cout<<0<
<< m; f[0][maxn-1] = 1; for(ll i=0;i

 

结果却。。。

还是NAIVE啊!!!

转载于:https://www.cnblogs.com/kczno1fans/p/7699982.html

你可能感兴趣的文章
jQuery 自定义函数
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
网卡流量检测.py
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>
yii 1.x 添加 rules 验证url数组
查看>>
html+css 布局篇
查看>>
SQL优化
查看>>
用C语言操纵Mysql
查看>>
轻松学MVC4.0–6 MVC的执行流程
查看>>
redis集群如何清理前缀相同的key
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
获取元素
查看>>
proxy写监听方法,实现响应式
查看>>
第一阶段冲刺06
查看>>
十个免费的 Web 压力测试工具
查看>>
EOS生产区块:解析插件producer_plugin
查看>>