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

파이썬 함수 결과값 자동 캐싱(cache, lru_cache), python
파이썬 함수 결과값 자동 캐싱(cache, lru_cache), python
파이썬 functools에는 cache와 lru_cache이 있다.둘 다 함수의 결과값을 자동으로 캐싱해 주는 기능이다. lru_cache(Least Recently Used)는 최근에 가장 적게 사용된 캐시를 삭제한다.또한 maxsize로 캐시 용량을
aiden0413.tistory.com
파이썬 함수 cache를 사용하면 동일한 인자에 대해 캐싱된 함수 결과를 반환하므로 dp와 동일한 효과를 얻을 수 있다.
dfs를 통해 가격이 이전 가격 보다 높으면 set에 해당 아티스트를 추가하면서 탐색을 진행하였다.
소유했던 사람 목록에 없고, 산 가격보다 큰 가격이라면 dfs로 계속 탐색해준다.
dict, list, set과 같이 원소를 추가, 삭제할 수 있는 자료형은 해시값이 바뀌는 unhashable type이므로 함수 캐싱을 할때 사용할 수 없다.
따라서 소유했던 사람 목록을 list, set이 아닌 비트마스킹으로 관리해주었다.

i번째 요소의 포함여부를 알고싶다면, (1<<i) | s 가 s와 같다면 i번째 요소가 포함된것이고, 다르다면 포함되지않은 것이다.
set에서의 in 과 동일한 결과를 얻을 수 있다.

만약 set에 포함시키고 싶다면 s와 (1<<i) 를 or연산을 해주면 된다.
s에 포함된 원소의 개수를 알고싶다면, s를 이진수로 바꾼뒤 1의 개수를 세어주면된다.
from functools import*
n = int(input())
prices = [[int(x) for x in input()] for _ in range(n)]
answer = 0
# cur,p,s 가 같다면 캐싱된 값을 사용한다.
@cache
def dfs(cur, p, s):
global answer
answer = max(answer,s.bit_count())
for i in range(n):
# 소유했던 사람 목록에 없고, 가격이 더 크다면
if (1<<i)|s != s and p<=prices[cur][i]:
# 가격을 업데이트하고 소유했던 사람 목록에 추가한다.
dfs(i, prices[cur][i],s | (1<<i))
dfs(0,0,1)
print(answer)

'python' 카테고리의 다른 글
| [백준] 10875 뱀, python (0) | 2025.10.31 |
|---|---|
| [백준] 18809 Gaaaaaaaaaarden, python (0) | 2025.10.30 |
| [백준] 2568 전깃줄 - 2, python (0) | 2025.10.28 |
| [백준] 6549 히스토그램에서 가장 큰 직사각형, python (0) | 2025.10.27 |
| [백준] 11668 파이프 청소, python (0) | 2025.10.25 |