https://www.acmicpc.net/problem/3056
3056번: 007
비밀 요원 007은 제임스 본드로 유명한 비밀 요원이다. 최근 알려진 정보에 의하면 제임스본드는 대다수 미션을 자신이 직접 수행하지 않는다고 한다. 본드는 미션을 자신과 비슷하게 생긴 사촌
www.acmicpc.net
DP Using Bitfield
dp[bit] = (상태 bit에서의 최대 확률) 이라고 정의하자.
dp[bit] = max(dp[bit], f(x + 1, bit | (1 << i)) * a[x][i] / 100) 이 된다.
템플릿 코드
더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import sys, math
import heapq
from collections import deque
input = sys.stdin.readline
hqp = heapq.heappop
hqs = heapq.heappush
#input
def ip(): return int(input())
def sp(): return str(input().rstrip())
def mip(): return map(int, input().split())
def msp(): return map(str, input().split().rstrip())
def lmip(): return list(map(int, input().split()))
def lmsp(): return list(map(str, input().split().rstrip()))
#gcd, lcm
def gcd(x, y):
while y:
x, y = y, x % y
return x
def lcm(x, y):
return x * y // gcd(x, y)
#prime
def isPrime(x):
if x<=1: return False
for i in range(2, int(x**0.5)+1):
if x%i==0:
return False
return True
# Union Find
# p = {i:i for i in range(1, n+1)}
def find(x):
if x == p[x]:
return x
q = find(p[x])
p[x] = q
return q
def union(x, y):
x = find(x)
y = find(y)
if x != y:
p[y] = x
def getPow(a, x):
ret = 1
while x:
if x&1:
ret = (ret * a) % MOD
a = (a * a) % MOD
x>>=1
return ret
def getInv(x):
return getPow(x, MOD-2)
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
dp = [-1 for _ in range(1 << 20)]
def f(x, bit):
if x == n:
return 1
if dp[bit] != -1:
return dp[bit]
for i in range(n):
if not bit & (1 << i):
dp[bit] = max(dp[bit], f(x + 1, bit | (1 << i)) * a[x][i] / 100)
return dp[bit]
n = ip()
a = [lmip() for _ in range(n)]
print(f(0, 0) * 100)
|
cs |
'백준 문제풀이' 카테고리의 다른 글
백준 21908 - Disk Sort [Python] (0) | 2022.03.24 |
---|---|
백준 13512 - 트리와 쿼리 3 [Python] (0) | 2021.09.08 |
백준 1311 - 할 일 정하기 1 [Python] (0) | 2021.09.02 |
백준 22040 - 사이클 게임 [Python] (0) | 2021.09.02 |
백준 9372 - 상근이의 여행 [Python] (0) | 2021.09.02 |