瓷磚鋪放公升級版 dfs解題

2021-08-20 21:34:07 字數 1372 閱讀 8958

題目描述

章魚王的行宮要鋪瓷磚了。 

行宮中有一長度為 n(

n≤30)

的地板,給定三種不同瓷磚:一種長度為1,一種長度為2,另一種長度為3,數目不限。

要將這個長度為 

n的地板鋪滿,並且要求任意兩個

相鄰的瓷磚長度

均不等,一共有多少種不同的鋪法?在所有的鋪設方法中,一共用了長度為1的瓷磚多少塊?

例如,長度為4的地面一共有如下3種鋪法,並且,一共用了長度為1的瓷磚4塊:

4=1+2+1

4=1+3

4=3+1

輸入描述

第一行乙個整數 t(t

≤30),表示測試組數。

接下來 t

行,每行只有乙個數 n(n

≤30),代表地板的長度。

輸出描述

對於每一組資料第一行有乙個數,代表所有不同的瓷磚鋪放方法的總數。

第二行也有乙個數,代表這些鋪法中長度為1的瓷磚的總數。

樣例輸入14

樣例輸出34

解題思路

在這道題目中,也是使用了dfs的思想去考慮計畫化法的動態規劃。

首先定義了2個陣列,f和g,分別用來存放瓷磚鋪放方法的總數以及鋪法中長度為1的瓷磚的總數。

然後定義乙個初始值f[0][0]=1。

f[i][j]代表的是地板長度為i,最後一塊瓷磚的長度為j。

f[i][j]+=f[i-j][k];//代表的即是當最後一塊瓷磚為j(1,2,3),即可以求出前i-j長度的地板共需要多少塊瓷磚。

又由於相鄰兩塊瓷磚的長度不能相同,所以又用了乙個迴圈,來控制j!=k,即是最後一塊瓷磚長度是j,倒數第二塊瓷磚長度是k。

#include #include #include #include using namespace std;

int t,ans,n,f[40][5],g[40][5];

int main()

}ans=0;

for (int i=1; i<=3; i++) ans+=f[n][i];

printf("%d\n",ans);

ans=0;

for (int i=1; i<=3; i++) ans+=g[n][i];

printf("%d\n",ans);

}return 0;

}

瓷磚鋪放(遞迴)

1 問題描述2 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?3 例如,長度為4的地面一共有如下5種鋪法 4 4 1 1 1 15 4 2 1 16 4 1 2 17 4 1 1 28 4 2 29 程式...

演算法訓練 瓷磚鋪放

問題描述 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?例如,長度為4的地面一共有如下5種鋪法 4 1 1 1 1 4 2 1 1 4 1 2 1 4 1 1 2 4 2 2 程式設計用遞迴的方法求解上述...

C語言 瓷磚鋪放

演算法訓練 瓷磚鋪放 時間限制 1.0s 記憶體限制 512.0mb 錦囊1遞迴或遞推。問題描述 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?例如,長度為4的地面一共有如下5種鋪法 4 1 1 1 1 ...