對于本題不去看LeetCode的評論區和題解很難想到如何去dp,畢竟就算再怎么枚舉也很難找到適用于面向結果的規律。所以對于題解我建議大家還是去看一下靈神給的題解,以下是靈神匯總的圖,如果能看懂的話,對于解決題目有很大的幫助。
根據圖中所示我們便能找到規律了
n=0 1
n=1 1
n為2 => 2 = 1* 2+0
n為3 => 5 = 2* 2+1
n為4 => 11 = 5* 2+1
n為5 => 24 = 11* 2+2
n為6 => 53 = 24* 2+5
n為7 =>117 = 53* 2+11
n為8 => 258 = 117* 2+24
n為n =>??? = dp[n-1]* 2+dp[n-2-1]
然后根據題目要求,我們還需要mod,所以最后的解題步驟如下所示
class Solution {private static final int MOD = 1_000_000_007;public int numTilings(int n) {if (n == 1) {return 1;}long[] f = new long[n + 1];f[0] = f[1] = 1;f[2] = 2;for (int i = 3; i <= n; i++) {f[i] = (f[i - 1] * 2 + f[i - 3]) % MOD;}return (int) f[n];}}