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?
?
?
?
?
轉載于:https://www.cnblogs.com/yours1103/p/3361673.html
總結
- 上一篇: JQuery选择器一般方法
- 下一篇: mac 下launchpad超级慢的问题