알고리즘/백준

5557 1학년

맛있는김치찜 2020. 10. 12. 01:19
#include <iostream>
#include <cstring>

using namespace std;

int N;
int numbers[101] {};
long long memo[101][21];

long long equations(int depth, int num)
{
    if (depth < 0 || num < 0 || num > 20) {
        return 0;
    }
    if (depth == 1 && num == numbers[1]) {
        return 1;
    }
    if (memo[depth][num] != -1LL) {
        return memo[depth][num];
    }

    memo[depth][num] = equations(depth - 1, num - numbers[depth]) + equations(depth - 1, num + numbers[depth]);

    return memo[depth][num];
}

void solve()
{
    long long ans = equations(N - 1, numbers[N]);
    cout << ans << endl;
}

void input()
{
    cin >> N;
    memset(memo, -1LL, sizeof(memo));
    for (int i = 1; i <= N; i++) {
        cin >> numbers[i];
    }
}

int main(void)
{
    input();
    solve();

    return 0;
}

처음엔 dfs로 해결하려고 했지만 너무 복잡해져서 다른 방법을 생각했다.

어짜피 각 자리수 까지의 연산 결과만 필요한거니 memo배열에 저장해놓고 이후 동일한 계산을 반복하지 않게 했다.

음수가 나오면 케이스는 종료된다. 그래서 아예 맨 처음에 각 자릿수까지의 연산 결과를 -1로 초기화했다.

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

2407 조합  (0) 2020.10.12
4811 알약  (0) 2020.10.12
1926 그림  (0) 2020.10.12
2251 물통  (0) 2020.10.12
2234 성곽  (0) 2020.10.12