프로그래머의 개발노트

[백준 9095] 1,2,3 더하기 (C++) 본문

백준 알고리즘

[백준 9095] 1,2,3 더하기 (C++)

7ULY 2021. 1. 21. 13:09



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



- 입력


첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.



- 출력


첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.



- 풀이


1,2,3 까지 구할수 있는 경우를 생각해보자.


- 1 

1


- 2 

1+1

2


- 3

1+1+1

1+2

2+1


이제 4를 생각해보면, 3에서 구했던 값들에 1을 더하고, 2에서 구했던 값들에 2를 더하고, 1에서 구했던 값들에 3을 더하면 된다.


1+1+1+1

1+2+1

2+1+1

=> dp(3)의 갯수와 동일


1+1+2

2+2

=> dp(2)의 갯수와 동일


1+3

=> dp(1)의 갯수와 동일


따라서, 점화식은 dp[n] = dp[n-1] + dp[n-2] + dp[n-3] (n >= 4)로 세울 수 있겠다.



- 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <vector>
 
#define endl "\n"
int T;
std::vector<int> dp;
 
void input_faster()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
}
void input()
{
    input_faster();
    std::cin >> T;
    dp.resize(110);
}
 
void print_val(int n)
{
    std::cout << dp[n] << endl;
}
 
void solve()
{
    int n;
    int i = 3;
 
    std::cin >> n;
 
    dp[1= 1;
    dp[2= 2;
    dp[3= 4;
    while (++<= n)
        dp[i] = dp[i - 1+ dp[i - 2+ dp[i - 3];
    print_val(n);
}
 
int main()
{
    input();
    while(T--)
        solve();
    return (0);
}
cs


'백준 알고리즘' 카테고리의 다른 글

[백준 1005] ACM Craft(C++)  (0) 2021.02.14
[백준 1003] 피보나치 함수 (C++)  (0) 2021.01.21
[백준 1463] 1로 만들기 (C++)  (0) 2021.01.21
[백준 17143] 낚시왕 (C++)  (0) 2021.01.20
[백준 1348] 주차장 (C++)  (0) 2021.01.17
Comments