Cometin'

BOJ-1633 - Python

2021-01-16 at Algorithm category

30 ~ 1000개의 두 정수를 입력받는다. 중복되지 않으며 한 줄에 한 개의 수만 선택가능할 때, 앞 수 15개, 뒷 수 15개를 합친 최대 값을 출력하는 문제. 첫 풀이는 함수를 재귀적으로 활용하여 dp[정수의 길이][16][16]의 크기를 갖는 배열에 값을 할당, 비교하여 풀었으나 문제의 풀이가 길어져 두 번째 풀이는 3중 반복문을 이용하여 할당, 비교하여 풀었다. 다이내믹 프로그래밍 문제를 더 공부해야겠다.

# def dfs(white, black, current_index, length):
#
#     if white == 0 and black == 0:
#         return 0
#     if current_index == length:
#         return 0
#     if dp[current_index][white][black] != 0:
#         return dp[current_index][white][black]
#
#     dp[current_index][white][black] = dfs(white, black, current_index+1, length)
#     if white > 0:
#         dp[current_index][white][black] = max(dp[current_index][white][black], dfs(white-1, black, current_index+1, length) + wl[current_index])
#     if black > 0:
#         dp[current_index][white][black] = max(dp[current_index][white][black], dfs(white, black-1, current_index+1, length) + bl[current_index])
#     return dp[current_index][white][black]
#
# wl, bl = [], []
# length = 0
# total = 0
#
# while True:
#     try:
#         w, b = map(int, input().split())
#         length += 1
#     except:
#         break
#     wl.append(w)
#     bl.append(b)
#
# dp = [[[0] * 16 for _ in range(16)] for _ in range(length+1)]
# print(dfs(15, 15, 0, length))


wl, bl = [0], [0]
length = 0
while True:
    try:
        white, black = map(int, input().split())
        length += 1
    except:
        break
    wl.append(white)
    bl.append(black)

dp = [[[0] * 16 for _ in range(16)] for _ in range(length+1)]
for idx in range(1, length+1):
    for w in range(16):
        for b in range(16):
            dp[idx][w][b] = dp[idx-1][w][b]
            if w > 0:
                dp[idx][w][b] = max(dp[idx][w][b], dp[idx-1][w-1][b] + wl[idx])
            if b > 0:
                dp[idx][w][b] = max(dp[idx][w][b], dp[idx-1][w][b-1] + bl[idx])

print(dp[-1][-1][-1])

hyesungoh

Personal blog by hyesungoh.

I like to share my knowledge for those who wandering in issue.