일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 우선순위큐
- 그래프 탐색
- 브루트포스
- 백트래킹
- 시뮬레이션
- 자료구조
- 다이나믹프로그래밍
- 해시
- 서브쿼리
- 에라토스테네스의 체
- 그리디
- BFS
- join
- 크루스칼
- 다익스트라
- 다이나믹 프로그래밍
- DP
- 그래프 이론
- 구현
- 분할정복
- 수학
- 플로이드-워셜
- 재귀
- 누적합
- 투포인터
- DFS
- 트리
- 다시
- MST
- GROUP BY
- Today
- Total
기록하고 까먹지 말기
9184 본문
날짜 : 2022. 10. 29
사용 언어 : python
문제
코드
import sys
def w(a, b, c):
if a <= 0 or b <= 0 or c <= 0:
return 1
if a > 20 or b > 20 or c > 20:
return w(20, 20, 20)
if dp[a][b][c]:
return dp[a][b][c] # 값이 이미 존재하면 리턴
if a < b < c :
dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return dp[a][b][c]
dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
return dp[a][b][c]
dp = [[[0] * 21 for i in range(21)] for j in range(21)]
while True:
a, b, c = map(int, sys.stdin.readline().split())
if a == -1 and b == -1 and c == -1:
break
print("w(%d, %d, %d) = %d"%(a, b, c, w(a, b, c)))
알게된 점
- DP에 관해서 애매하게 알고 있었던 것을 확인하는 문제였다.
- 피보나치 문제를 경험으로 단순 for문을 돌려서 문제를 푸는 것이 DP라고 생각했는데 찾아보니 문제를 분할하여 이를 이용해 풀이하는 것이 DP라는 것을 알게되었다.
- 풀이를 보니 중간에 if문을 하나 더 넣음으로써 기존에 값이 이미 존재하는 경우 이를 곧바로 리턴하여 불필요한 재귀를 방지하는 것이 골자였다.
- 그리디는 많이 풀어보았지만 다른 문제들을 풀어보지 않아서 많이 공부해야한다는 것을 알게 되는 문제였다.
참고 사이트
- https://galid1.tistory.com/507
알고리즘 - Dynamic Programming(동적프로그래밍)이란?
Dynamic Programming(동적계획법) 이란 1. Dynamic Programming(동적계획법)이란? 큰 문제를 작은문제로 나누어 푸는 문제를 일컫는 말입니다. 동적 계획법이란 말 때문에 어떤 부분에서 동적으로 프로그래
galid1.tistory.com
백준 9184번 신나는 함수 실행 (Python)
문제에 점화식까지 쓰여있어서 당황스러웠다.. 너무나도 당연하게 문제에 쓰여져있는대로 코드를 작성하면 안된다! 재귀함수를 사용해야할 때 이것을 메모이제이션 하는 방법을 묻는 문제이다
seraup.dev
메모이제이션 - 나무위키
이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권
namu.wiki