[BOJ]90951,2,3プラス(ダイナミックプログラミング)


1.質問


https://www.acmicpc.net/problem/9095

2.アイデア



3.解法


1)使用110 GHT⭕-繰り返し文

  • コード
  • #include <iostream>
    using namespace std;
    
    int addition[11] = { 0,1,2,4};
    
    int solve(int n)
    {
    	if (addition[n]) return addition[n];
    	else return addition[n] = solve(n - 1) + solve(n - 2) + solve(n - 3);
    }
    
    int main() {
    	ios::sync_with_stdio(false);
    	cin.tie(NULL); cout.tie(NULL);
    
    	int T; // Testcase 수
    	int n;
    
    	cin >> T;
    
    	solve(10); // 가능한 모든 n에 대해서 미리 구하여둠
    	while (T--)
    	{
    		cin >> n;
    		cout << addition[n] << '\n';
    	}
    	return 0;
    }
  • その他の説明
    -どうして11に加算されたの?
    nの範囲は1以上10以下の整数
    0種類の0を追加する方法
    プラス1の方法は1種類あります
    2種類の加算
    プラス3の4つの方法
    ...
    nの加算[n]種
  • 2)110 GHT⭕-再使用

  • コード
  • #include <iostream>
    using namespace std;
    
    int DP[12] = { 0 };
    
    int recursive(int i) {
    	if (i == 1) return 1;
    	if (i == 2) return 2;
    	if (i == 3) return 4;
    	DP[i] = recursive(i - 1) + recursive(i - 2) + recursive(i - 3);
    
    	return DP[i];
    }
    
    int main() {
    	ios_base::sync_with_stdio(false);
    	cin.tie(NULL); cout.tie(NULL);
    
    	int testcase; cin >> testcase;
    	int max_prev_n = 3, cur_n;
    
    	DP[0] = 0;
    	DP[1] = 1; DP[2] = 2; DP[3] = 4;
    
    	while (testcase--) {
    		cin >> cur_n;
    		
    		if (max_prev_n < cur_n) recursive(cur_n);
    
    		cout << DP[cur_n] << '\n';
    
    		if (max_prev_n < cur_n) max_prev_n = cur_n;
    	}
    	return 0;
    }
  • その他の説明
  • if (max_prev_n < cur_n)
    与えられた複数回の試験例で求めた場合、再帰計算を行わず、結果を直接出力する.
    (ex.テストケースが7,4,10の順序で与えられる場合、4は再帰計算を行わない)