ZOJ1100Mondriaan's Dream
2016-03-22 12:09
204 查看
用1*2的砖去恰好铺满n*m的地板
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { new ZOJ1100().run(); } } class ZOJ1100 { void run() { Scanner cin = new Scanner(new BufferedInputStream(System.in)); PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out)); int h, w; while (true) { h = cin.nextInt(); w = cin.nextInt(); if (h == 0 && w == 0) break; if (h < w) { int t = h; h = w; w = t; } List<State> states = new ArrayList<State>(); dfs(0, 0, 0, states, w); for (int i = 0; i <= h; i++) Arrays.fill(dp[i], 0L); int limit = (1 << w) - 1; dp[0][limit] = 1L; for (int row = 0; row < h; row++) { for (State state : states) { dp[row + 1][state.to] += dp[row][state.from]; } } cout.println(dp[h][limit]); } cout.flush(); } void dfs(int pos, int from, int to, List<State> state, int w) { if (pos > w) return; if (pos == w) { state.add(new State(from, to)); return; } dfs(pos + 2, from << 2 | 3, to << 2 | 3, state, w); dfs(pos + 1, from << 1 | 1, to << 1, state, w); dfs(pos + 1, from << 1, to << 1 | 1, state, w); } final int N = 11; long[][] dp = new long[N + 1][(1 << N) + 1]; } class State { int from, to; State(int from, int to) { this.from = from; this.to = to; } }
相关文章推荐
- latex自定义命令
- C# 堆栈(Stack)
- Tesseract-ocr的安装
- buptoj 941:Mr.L's Journey
- 蓝桥杯 基础练习 查找整数
- 几行代码实现图片的模糊效果
- RTX 组织架构刷新不出来
- CocoaPods 找不到头文件
- Git存储用户名和密码(明文需谨慎)
- 第十九讲--实例崩溃恢复原理剖析
- 第二章--类型运算符表达式
- Git存储用户名和密码(明文需谨慎)
- 蓝桥杯 基础练习 数列特征
- LeetCode--242. Valid Anagram
- 关于TextReader
- iOS SDK具体解释之UIDevice(系统版本号,设备型号...)
- RMQ算法
- RMQ算法
- MySQL数据类型--字符串类型
- Lua中的异常处理pcall、xpcall、debug使用实例