藍橋杯 ALGO-11演算法訓練 瓷磚鋪放(遞迴/動態規劃)
阿新 • • 發佈:2019-01-11
問題描述
有一長度為N(1<=N<=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
程式設計用遞迴的方法求解上述問題。
輸入格式
只有一個數N,代表地板的長度
輸出格式
輸出一個數,代表所有不同的瓷磚鋪放方法的總數
樣例輸入
4
樣例輸出
5
用遞迴的方法解:
#include <iostream> using namespace std; int cnt = 0; void dfs(int n) { if(n == 1) { cnt++; return ; } if(n == 2) { cnt++; dfs(n - 1); return ; } dfs(n-1); dfs(n-2); } int main() { int n; cin >> n; dfs(n); cout << cnt; return 0; }
用動態規劃的方法解:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> v(n+1);
v[0] = 1, v[1] = 1;
for(int i = 2; i <= n; i++) {
v[i] = v[i-1] + v[i-2];
}
cout << v[n];
return 0;
}