728x90
반응형
https://www.acmicpc.net/problem/2157
2157번: 여행
첫째 줄에 N(1 ≤ N ≤ 300), M(2 ≤ M ≤ N), K(1 ≤ K ≤ 100,000)가 주어진다. K는 개설된 항공로의 개수이다. 다음 K개의 줄에는 각 항공로에 대한 정보를 나타내는 세 정수 a, b, c(1 ≤ a, b ≤ N, 1 ≤ c ≤ 1
www.acmicpc.net
문제 해결
- 처음에 다익스트라로 풀려고 했으나 k가 매우 클 수 있는 바람에 시간초과가 났다.
- 큰 수를 계산해야할 때는 무조건 dp가 된다!
- 그럼 dp를 어떻게 잡아야할까?
- 우선 똑같은 출발지에서 도착지점까지 항공로가 여러가지가 있을 수 있기 때문에 graph를 $ n \times n$ 행렬을 만든다음 graph[i][j]의 값읠 i에서 j까지 가는 항공로 중 최대 점수라고 정의하고 값을 넣는다.
- dp[i][j]는 1에서 i까지 누적해서 j개의 도시를 가면서 얻은 점수라고 정의를 한다.
- 그러면 dp[i][j] = max(dp[i][j], dp[l][j-1]+graph[l][i]) 가 된다. (참고로 l<i 이며 j<m+1 이다.)
- 이렇게 생각하면 코드 구현하긴 쉽다!
CODE
import sys
input = sys.stdin.readline
n, m, k = map(int,input().split())
graph = [[0]*(n+1) for _ in range(n+1)] # graph[i][j] i에서 j까지 가는데 value 최댓값
dp =[[0]*(m+1) for _ in range(n+1)] # dp[i][j]는 1번에서 i까지 j개의 도시를 걸쳐(1,j 포함) 갈 수 있는 최댓값
for _ in range(k):
start, end, value = map(int, input().split())
if start>end: continue
graph[start][end] = max(graph[start][end],value)
for i in range(2,n+1):
dp[i][2] = graph[1][i]
for i in range(2,n+1):
for j in range(3,m+1):
for l in range(1,i):
if graph[l][i] and dp[l][j-1]:
dp[i][j] = max(dp[i][j],dp[l][j-1]+graph[l][i])
print(max(dp[n]))
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 2109 순회강연 (0) | 2023.05.08 |
---|---|
[python] 백준 1949 우수 마을 (0) | 2023.05.07 |
[python] 백준 1132 합 (0) | 2023.05.07 |
[python] 백준 2666 벽장문의 이동 (0) | 2023.05.06 |
[python] 백준 2831 댄스 파티 (0) | 2023.05.06 |
댓글