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 }
View Code

 

 

 

 

 

posted @ 2013-10-10 17:11  Yours1103  阅读(128)  评论(0编辑  收藏  举报