1. 程式人生 > >藍橋杯 ALGO-11演算法訓練 瓷磚鋪放(遞迴/動態規劃)

藍橋杯 ALGO-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;
}