LA 3904
一道DP题;
一共有三种砖,1*2,2*1,2*2,然后要你铺满整个n*2的地板,求不重复的铺法数;
方法:
首先计算了不考虑对称的情况,然后计算只考虑对称的情况;
所以结果就是(不考虑对称数+只考虑对称数)/2;
递推关系:
dp[i] 表示左右各伸展 i 的对称情况。
dp[i+1] += dp[i] //两边补上 1 x 2
dp[i+2] += dp[i]*2//两边补上 2x1 跟 2x2 兩种。
然后只考虑对称的情况下有两种情况:
n==奇数:
中间有个1*2;
n==偶数;
中间有两个2*1;
或者两个2*1或者一个2*2;
代码:
1 #include<stdio.h> 2 #include<cstring> 3 using namespace std; 4 int dp1[105],dp[105]; 5 6 int main() 7 { 8 int t; 9 int i, j, k, n; 10 dp1[0] = 1; 11 for(i = 0; i < 105; i++) 12 { 13 dp1[i+2] += dp1[i]*2; 14 dp1[i+1] += dp1[i]; 15 } 16 scanf("%d", &t); 17 while(t--) 18 { 19 memset(dp,0,sizeof dp); 20 scanf("%d", &n); 21 if(n&1) 22 { 23 dp[1] = 1; 24 dp[2] = 2; 25 for(i = 1; i <= n/2; i++) 26 { 27 dp[i+1] += dp[i]; 28 dp[i+2] += dp[i]*2; 29 } 30 printf("%d\n", (dp1[n]+dp[(n-1)/2])/2); 31 } 32 else 33 { 34 dp[1] = 3; 35 dp[2] = 2; 36 for(i = 1; i <= n/2; i++) 37 { 38 dp[i+1] += dp[i]; 39 dp[i+2] += dp[i]*2; 40 } 41 printf("%d\n", (dp1[n]+dp[n/2])/2); 42 } 43 } 44 return 0; 45 }