N = int(input())

arr = list(map(int,input().split()))
dp = [[0]*21 for _ in range(N)]

dp[0][arr[0]] = 1
for ind in range(1,N-1):
    for prev_num in range(21):
        if dp[ind-1][prev_num]:
            for new_num in [prev_num+arr[ind],prev_num-arr[ind]]:
                if 0<=new_num<=20:
                    dp[ind][new_num] += dp[ind-1][prev_num]

print(dp[N-2][arr[-1]])

매번 어려운 DP 문제이다. 

 

여기서 제일 헷갈렸던것은 인덱스였다. 

먼저 dp의 행은 주어진 입력의 몇번째 index에서의 행해진 것인지 나타낸다.

그리고 열은 이 문제는 0~20 사이의 값만 있으므로, 21개의 열을 미리 만들어줬다.

 

먼저 dp를 0으로 초기화 시킨다.

 

그리고 dp[0][arr[0]] = 1로 초기화 한다.

 

가장 첫번째 숫자는 무조건 더해져야하기 때문이다.

그리고 그 다음부터는 0~21 까지를 prev_num으로 반복문을 돌리고 현재 ind의 arr값과 더했을때

0~20 사이이면 현재 ind의 새로운값에 더해주면 된다.

 

그리고 이 모든 행위는 N-2번 인덱스에서 종료되기 때문에, 출력할때 [N-2][arr[-1]]을 해주도록 하자.

 

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

[BOJ/백준] 1600 말이 되고픈 원숭이  (0) 2021.02.16
[BOJ/백준] 11758 CCW  (0) 2021.02.16
[BOJ/백준] 2493 탑  (0) 2021.02.16
[BOJ/백준] 1915 가장 큰 정사각형  (0) 2021.02.16
[BOJ/백준] 2225 합분해  (0) 2021.02.16

+ Recent posts