article thumbnail image
Published 2021. 8. 4. 23:32

문제 설명

문제 링크

http://icpc.me/5557

 

5557번: 1학년

상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀

www.acmicpc.net

풀이

dp를 이용하여 해결할 수 있다.

dp[i][j] : j번째 숫자까지 봤을 때 숫자 i를 만들 수 있는 최댓값으로 정의할 수 있다.

코드

#include <cstdio>

using ll = long long;

ll dp[22][102], arr[102], n;

ll dpf(ll cur, ll idx) {
    if (cur < 0 || cur > 20) return 0;
    
    ll &ret = dp[cur][idx];
    if (ret) return ret;
    if (idx == n - 2) return cur == arr[n - 1];

    return ret += dpf(cur - arr[idx + 1], idx + 1) + dpf(cur + arr[idx + 1], idx + 1);
}

int main() {
    scanf("%lld", &n);
    for (ll i = 0; i < n; i++) {
        scanf("%lld", arr + i);
    }
    printf("%lld", dpf(arr[0], 0));
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[16991] 외판원 순회 3  (0) 2021.08.10
백준[3648] 아이돌  (0) 2021.08.06
백준[2225] 합분해  (0) 2021.08.04
백준[9084] 동전  (0) 2021.08.04
백준[1915] 가장 큰 정사각형  (0) 2021.08.04
복사했습니다!