[21416][伯俊/BOJ]9095号1.2.3プラス
1524 ワード
質問する
にゅうしゅつりょく
に答える
4を1、2、3の和として表す方法は、次のとおりです.
1+1+1+1
1+2+1
2+1+1
3+1
1+1+2
2+2
1+3
全部で7種類あります.
各方法の後ろから+1,+2,+3が見える.それ以外は
3を1,2,3の和の1+1+1+2,2+13と表す
2の1、2、3の和を表す1+1、2
1を1の和として表すことができます.
すなわちd(1)+1,d(2)+2,d(3)+3である.
したがって、これを点火式、すなわちd(n)=d(n−1)+d(n−2)+d(n−3)、初期値d(1)=1、d(2)=2、d(3)=4と表す.
コード#コード#
上から下へ
#include <bits/stdc++.h>
using namespace std;
int d[102];
int dp(int n)
{
if (n == 1) return 1;
if (n == 2) return 2;
if (n == 3) return 4;
if (d[n] != 0) return d[n];
d[n] = dp(n - 1) + dp(n - 2) + dp(n - 3);
return d[n];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int tc;
cin >> tc;
while (tc--)
{
int n;
cin >> n;
cout << dp(n) << '\n';
}
}
bottom-up方式#include <bits/stdc++.h>
using namespace std;
int d[102];
int dp(int n)
{
d[1] = 1; // 1+3
d[2] = 2; // 1+1+2, 2+2
d[3] = 4; // 1+1+1+1, 1+2+1. 2+1+1, 3+1
for (int i = 4; i <= n; ++i)
d[i] = d[i - 1] + d[i - 2] + d[i - 3];
return d[n];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int tc;
cin >> tc;
while (tc--)
{
int n;
cin >> n;
cout << dp(n) << '\n';
}
}
Reference
この問題について([21416][伯俊/BOJ]9095号1.2.3プラス), 我々は、より多くの情報をここで見つけました https://velog.io/@kwkim95/210416백준BOJ-9095번-1-2-3-더하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol