본문 바로가기

BOJ/C++

[BOJ] 5557. 1학년

*dp[][] 에는 현재 인덱스에서 나온 결과에 따라 경우의 수를 저장한다.

8 3 2 4 8 7 2 4 0 8 8

dp[0][8] = 1 

1. 8+3 == 11 로 0과 20 사이의 수이므로 

dp[1][11] = 1

2. 8-3 == 5 

dp[1][5] = 1

 

이런 식으로 경우의 수를 표시해야 한다. 

 

*하지만 이 경우가 마지막에 부등호가 성립되어야 하기 때문에

부등호가 나와야 하는 직전의 인덱스 (n-1)까지 간 후에 숫자들을 저장하고 있는 num[n-1]의 값과 현재까지 계산한 값이 같다면 1을 반환 / 같지 않다면 0을 반환한다. 

 

 

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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
typedef unsigned long long ll;
int n;
int num[101];
bool visited[101];
ll dp[101][21]; //계산 후 나오는 수에 따라 경우의 수를 저장한다.
 
ll dfs(int idx, int res) {
     
    if (idx == n - 1) {
        if (res == num[n - 1]) return 1;
        else return 0;
    }
 
    if (dp[idx][res]) return dp[idx][res];
 
    ll& ret = dp[idx][res];
 
    if (res - num[idx] >= 0) {
        ret += dfs(idx + 1, res - num[idx]);
    }
    if (res + num[idx] <= 20) ret += dfs(idx + 1, res + num[idx]);
 
    return ret;
}
int main() {
 
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> n;
 
    for (int i = 0; i < n; i++) {
        cin >> num[i];
    }
 
    dp[0][num[0]] = 1;
    cout << dfs(1, num[0]) << '\n';
 
    return 0;
}

'BOJ > C++' 카테고리의 다른 글

[BOJ] 16988. Baaaaaaaaaduk2 (Easy)  (0) 2020.03.16
[BOJ] 10711. 모래성  (0) 2020.03.15
[BOJ] 3709. 레이저빔은 어디로  (0) 2020.03.13
[BOJ] 1520. 내리막길  (0) 2020.03.13
[BOJ] 11723. 집합  (0) 2020.03.12