題目描述
章魚王的行宮要鋪瓷磚了。
行宮中有一長度為 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 ...