백준/DP

[백준 5557번 / C++] 1학년

배발자 2022. 2. 22.

목차

    반응형

    DP를 활용한 문제이다. 

     

    #접근방법 

    1. 입력할 수 있는 개수 최대 100과 최대 sum값을 20을 가지기 때문에 dp[101][21] 배열 생성. 
    2. 등호를 붙여야 하는 (index-2) 위치에 도달 할 때까지 dfs방식으로 호출한다. ("- 연산", "+ 연산" )

        - sum값이 0보다 작거나 20보다 크면 return 0

        - 이미 메모이제이션이 되있는 경우 해당 값을 return

        - (index-2) 위치에 도달했을 때 마지막값과 sum값이 같으면 return 1 (카운트) 

       

    
      
    #include <iostream>
    using namespace std;
    typedef long long ll;
    int n;
    ll dp[101][21];
    ll d[101];
    ll go(int idx, int sum) {
    if (sum < 0 || sum>20)return 0;
    ll& ret = dp[idx][sum];
    if (ret)return ret;
    if (idx == n - 2) {
    if (sum == d[n - 1]) {
    return 1;
    }
    return 0;
    }
    ret += go(idx + 1, sum + d[idx+1]);
    ret += go(idx + 1, sum - d[idx+1]);
    return ret;
    }
    int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
    cin >> d[i];
    }
    cout << go(0, d[0]);
    return 0;
    }
     

    5557번: 1학년

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

    www.acmicpc.net

    [백준 5557번 / C++] 1학년

    반응형

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

    [백준 11052번 / C++] 카드 구매하기  (0) 2022.03.08
    [백준 1520번 / C++] 내리막 길  (0) 2022.02.24
    [백준 1149번 / C++] RGB거리  (0) 2022.02.17
    [백준 12869번 / C++] 뮤탈리스크  (1) 2022.02.09
    [백준 1450번 / C++] 냅색문제  (0) 2022.01.26

    댓글