动态规划-填格子问题 Domino and Tromino Tiling
2018-09-01 22:38:19
问题描述:
问题求解:
本题如果是第一看到,应该还是非常棘手的,基本没有什么思路。
不妨先从一种简化的版本来考虑。如果仅有一种砖块,那么,填充的方式如下。
从上面可以看出,本质上是一条动态规划问题,递推式就是Fib序列。
那么针对本问题,需要考虑的情况就复杂了一些。
public int numTilings(int N) { long[][] dp = new long[N + 1][2]; dp[0][0] = 1; dp[1][0] = 1; int mod = (int)Math.pow(10, 9) + 7; for (int i = 2; i <= N; i++) { dp[i][0] = (dp[i - 1][0] + dp[i - 2][0] + 2 * dp[i - 1][1]) % mod; dp[i][1] = (dp[i - 1][1] + dp[i - 2][0]) % mod; } return (int)dp[N][0]; }
以上的index是从1开始的,当然也可以从0开始,如下:
public int numTilings(int N) { if (N <= 1) return 1; long[][] dp = new long[N][2]; dp[0][0] = 1; dp[1][0] = 2; dp[1][1] = 1; int mod = (int)1e9 + 7; for (int i = 2; i < N; i++) { dp[i][0] = (dp[i - 1][0] + dp[i - 2][0] + 2 * dp[i - 1][1]) % mod; dp[i][1] = (dp[i - 1][1] + dp[i - 2][0]) % mod; } return (int)dp[N - 1][0]; }