有一个4xn的棋盘,无限个1x2的多米诺骨牌。输入n,求把棋盘完美覆盖的方法数。
这应该是一个组合题,但是我的组合还有极大的提升空间,所以根据老大的意见用dp做。方法如下二维数组dp[n][m]表示有n列且该列状态为m的时候的排列方法数。m用四位二进制表示,第a位表示该列第a行的状态,1已经覆盖,0表示没有被覆盖。初始状态为:
dp[
1
][
3
]
=
dp[
1
][
6
]
=
dp[
1
][
12
]
=
dp[
1
][
15
]
=
dp[
1
][
0
]
=
1
;
状态转移:
dp[t][
15
]
=
dp[t
-
1
][
15
]
+
dp[t
-
1
][
12
]
+
dp[t
-
1
][
3
]
+
dp[t
-
1
][
6
]
+
dp[t
-
1
][
0
];
dp[t][ 9 ] = dp[t - 1 ][ 6 ];
dp[t][ 12 ] = dp[t - 1 ][ 15 ] + dp[t - 1 ][ 3 ];
dp[t][ 3 ] = dp[t - 1 ][ 15 ] + dp[t - 1 ][ 12 ];
dp[t][ 6 ] = dp[t - 1 ][ 15 ] + dp[t - 1 ][ 9 ];
dp[t][ 0 ] = dp[t - 1 ][ 15 ];
dp[t][ 9 ] = dp[t - 1 ][ 6 ];
dp[t][ 12 ] = dp[t - 1 ][ 15 ] + dp[t - 1 ][ 3 ];
dp[t][ 3 ] = dp[t - 1 ][ 15 ] + dp[t - 1 ][ 12 ];
dp[t][ 6 ] = dp[t - 1 ][ 15 ] + dp[t - 1 ][ 9 ];
dp[t][ 0 ] = dp[t - 1 ][ 15 ];
做完这个题,在以后遇到组合题的时候也应该多一个思考方向,不一定是显示公式,不一定是递推公式,还有可能是状态转移!