日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LA 3904

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的LA 3904的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。