9095번: 1, 2, 3 더하기 (acmicpc.net)
9095번 : 1, 2, 3 더하기
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
생각해 볼 점
문제의 점화식을 구하면 금방 풀리는 DP 문제입니다.
f(1) = 1
f(2) = 1 + f(1)
f(3) = 1 + f(2) + f(1)
f(4) = f(3) + f(2) + f(1)
.
.
.
f(n) = f(n - 3) + f(n - 2) + f(n -1)
이해가 가지 않는다면, 예시로, f(4)를 구해봅시다.
1 = {1}
2 =
{1 + 1,
2}
3 =
{1 + 1 + 1, 2 + 1,
1 + 2,
3}
4 =
{1 + 1 + 1 + 1, 2 + 1 + 1, 1 + 2 + 1, 3 + 1,
1 + 1 + 2, 2 + 2,
1 + 3}
즉, f(n-1)의 결과에 + 1, f(n -2)의 결과에 + 2, f(n-3)의 결과에 + 3을 한 것이 f(n)이기 때문에
이런 점화식이 성립합니다.
코드
#include <iostream>
using namespace std;
#pragma warning(disable : 4996)
int* dp;
int solution(int summ, int N)
{
if (N < summ) return 0;
if (summ == N) return 1;
if (dp[summ] != -1) return dp[summ];
return dp[summ] = solution(summ + 1, N) + solution(summ + 2, N) + solution(summ + 3, N);
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int input;
scanf("%d", &input);
dp = new int[input + 1];
fill_n(dp, input + 1, -1);
printf("%d\n", solution(0, input));
delete[] dp;
}
return 0;
}
그 외
'공부 및 정리 > 백준 코드' 카테고리의 다른 글
[C++]백준 - 16637번 문제 (0) | 2021.12.03 |
---|---|
[C++]백준 - 1086번 문제 (0) | 2021.12.02 |
[C++]백준 - 1764번 문제 (0) | 2021.12.01 |
[C++]백준 - 16112번 문제 (0) | 2021.12.01 |
[C++]백준 - 17435번 문제 (0) | 2021.11.30 |