[テストコードC+]1.2.3プラス記号


今日の質問


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

1、2、3を合わせる



私の答え

// 1, 2, 3 더하기
int solution(int t){
    vector<int> n(3, 0);
    n[0] = 1;
    n[1] = 2;
    n[2] = 4;
    if(t <= 3)
        return n[t-1];
    for(int i=4;i<=t;i++){
        int sum = n[0] + n[1] + n[2];
        n[0] = n[1];
        n[1] = n[2];
        n[2] = sum;
    }
    return n[2];
}

解法

  • 入力値の範囲は11なので、以前は直接dpを使っていましたが、メモリが超過しました.
  • 以前に解かれたフィボナッチと同様の論理であるため,3つのフィボナッチに解ける.
  • 一つ失敗したのは0,1,2なら早めに返却しなかったから、ふふ
  • 模範解答

    #include <cstdio>
    int t[11] = {0,1,2,4,7,13,24,44,81,149,274};
    int main() {
    	int n,x;
    	scanf("%d", &n);
    	while (n--) {
    		scanf("%d", &x);
    		printf("%d\n",t[x]);
    	}
    	return 0;
    }

    学ぶべきところ

  • 、範囲がどんなに狭くても、これは・・・ぶるぶる震える.