문제


https://www.acmicpc.net/problem/3056


풀이


확률이 나와 당황스러울 수 있지만, 다른 비트필드에서의 DP 문제와 별반 다를 것이 없다.

미션을 이미 할당받은 지미 본드들의 정보와 현재까지의 성공 확률이 주어지면 부분 문제가 성립한다.

이 문제도 클레이 사격 게임처럼 최댓값을 구하고 있으므로 1차원 DP로 풀이 가능하다.


코드


import sys

n = int(sys.stdin.readline())
board = [list(map(lambda x: int(x) / 100, sys.stdin.readline().split())) for _ in range(n)]
dp = [0] * 2 ** n
dp[0] = (1, 0)

for mask in range(1, 2 ** n):
    res1 = 0
    use1 = 0
    for i in range(n):
        if mask & (1 << i):
            _, use2 = dp[mask ^ (1 << i)]
            if _:
                res2 = 0
                idx = -1
                for j in range(n):
                    if (not use2 & (1 << j)) and (res2 < board[i][j]):
                        res2 = board[i][j]
                        idx = j

                if idx != -1:
                    res2 *= dp[mask ^ (1 << i)][0]
                    use2 ^= (1 << idx)

                    if res1 < res2:
                        res1 = res2
                        use1 = use2

    dp[mask] = (res1, use1)

print(dp[-1][0] * 100)

이 문제는 Bottom-up 방식으로 풀어보았다.

Leave a comment