87946 - 피로도
info
- 문제 보기: 87946 - 피로도
- 소요 시간: 17분 20초
- 풀이 언어:
python
- 체감 난이도: 2️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
완전탐색
dp
풀이 코드
info
- 메모리: 9420 KB
- 시간: 73 ms
import sys
sys.setrecursionlimit(10**6)
d = []
visited = []
def dp(ddx, k):
global visited
ans = [0]
for i in range(len(d)):
req, cost = d[i][0], d[i][1]
if req <= k and not visited[i]: # 최소 피로도 ok
visited[i] = True
ans.append(dp(i, k-cost) + 1) # 피로도 소모
visited[i] = False
return max(ans)
def solution(k, dungeons):
global d, visited
d = dungeons
visited = [False for _ in range(len(d))]
ans = [0]
for i in range(len(d)):
if d[i][0] <= k and not visited[i]: # 최소 피로도 ok
visited[i] = True
ans.append(dp(i, k-d[i][1]) + 1) # 피로도 소모
visited[i] = False
return max(ans)
풀이 해설
던전 수가 최대 8개여서 무지성 완탐 들박이 가능하다.
이 경우, n개의 던전을 모두 어느 순서로든 방문할 수 있을만큼 피로도가 충분한 최악의 상황을 가정할 때
nPn = n! 이므로 이라는 매우 살벌한 시간복잡도를 가지게 된다.
메모
함수명을 dp라고 해놨지만 사실 dp가 아닌 그냥 완탐임.
- 오랜만에 무지성 제출 1트 컷했다.
dp 최적화가 먹히려면 일정 조건에서 패스해도 된다는 증명이 필요함.
- 정렬로 전처리하면 dp가 먹힌다는 사실
- 냅색이랑 바텀업 dp를 우선적으로 밀어야 할 것 같다. (탑다운 금지❌)
- 정렬로 전처리하면 dp가 먹힌다는 사실