https://www.acmicpc.net/problem/9095
문제 요약
정수 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의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
문제 풀이
1. 계산할 숫자의 수를 입력받습니다. 그 수만큼 반복문을 만들어 계산할 숫자를 입력받습니다. ( n은 0보다 크고 11보다 작아야 합니다.)
2. bottom-up을 해줄 함수 dp를 만듭니다. 이 함수에서는 1부터 11까지의 1, 2, 3의 합으로 나타내는 방법의 수를 배열에 담아줍니다.
3. 1부터 3까지 패턴이 없는 수 까지는 초기값을 주고, 4부터는 1전항 2전항 3전항의 총합을 저장해주도록 짭니다.
4. 계산할 수들을 만든 배열의 인덱스에 넣고 출력합니다.
주의할 점
이 문제는 다이나믹 프로그래밍 알고리즘인 bottom-up 알고리즘을 이용하여 풀어야하는 문제입니다.
패턴이 4부터 생기기 때문에 3까지 초기값을 주어 4부터 계산해야 합니다.
코드
#include<iostream>
#include<vector>
using namespace std;
vector<int>v;
int p[11];
int n;
int t;
void dp()
{
// 최대값인 11까지의 1, 2, 3의 합으로 나타내는 방법의 수 저장
p[1] = 1;
p[2] = 2;
p[3] = 4;
for (int i = 4; i <= 11; i++)
{
p[i] = p[i - 1] + p[i - 2] + p[i - 3];
}
}
int main()
{
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> n;
if (n <= 0 || n > 10)
{
return 0;
}
v.push_back(n);
}
dp();
// 입력 받은 값들 출력
for (int i = 0; i < t; i++)
{
cout << p[v[i]] << "\n";
}
return 0;
}
반응형
예제
3
4
7
10
결과
'BAEKJOON > Dynamic Programming' 카테고리의 다른 글
C++ / 2579 / 계단 오르기 ( 다이나믹 프로그래밍 ) (4) | 2024.11.16 |
---|---|
C++ / 2294 / 동전 2 ( 다이나믹 프로그래밍 ) (0) | 2024.11.14 |
C++ / 2293 / 동전 1 ( 다이나믹 프로그래밍 ) (0) | 2024.11.13 |
C++ / 1463 / 1로 만들기 ( 다이나믹 프로그래밍 ) (0) | 2024.11.09 |
C++ / 11726 / 2 x n 타일링 ( 다이나믹 프로그래밍 ) (0) | 2024.10.31 |