https://www.acmicpc.net/problem/17404
집이 총 n개가 있음
집을 빨강, 초록, 파랑 중 하나로 칠해야 함
매번 칠할 떄 가격이 서로 다름
색상은 이전 집과 항상 달라야함
첫 번째 집과, n번째 집의 색상은 서로 달라야 함
입력
첫 번째 줄 : n
n : 집의 개수
n개의 줄 : n번째 집을 칠할 때 드는 색상별 비용
출력
모든 집을 칠하는 최소 값 구하기
어제 풀었던 RGB거리와 입력과 출력 양식이 정확히 동일한 문제입니다.
https://angelplayer.tistory.com/581
다만 위 문제와 차이점은 조건으로 첫 번째 집과, 마지막 집의 색상이 서로 달라야 한다는 점입니다.
이 문제를 해결하기 위해서 dp의 저장 조건에 첫 번째 집을 어떤 색을 칠했는지를 추가해 주었습니다.
import sys
sys.setrecursionlimit(10**8)
def recursive(idx, bef, fir):
global n
if idx == n:
if bef != fir:
return 0
else:
return int(1e9)
if dp[fir][idx][bef] == -1:
ret = int(1e9)
for i in range(3):
if i != bef:
ret = min(ret, recursive(idx + 1, i, fir) + arr[idx][i])
dp[fir][idx][bef] = ret
return dp[fir][idx][bef]
n = int(input())
arr = []
for _ in range(n):
arr.append(list(map(int, input().split())))
dp = [[[-1] * 3 for _ in range(n)] for _ in range(3)]
ans = int(1e9)
for i in range(3):
ans = min(ans, arr[0][i] + recursive(1, i, i))
print(ans)
~~
해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.
혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!
python source : https://github.com/ssh5212/conding-test-practice
java source : https://github.com/ssh5212/coding-test-java
[BOJ / 백준] 3584 가장 가까운 공통 조상 (G4 / 트리) - Python (0) | 2024.07.15 |
---|---|
[BOJ / 백준] 17298 오큰수 (G4 / 스택) - Python (1) | 2024.07.12 |
[BOJ / 백준] 1149 RGB거리 (S1^ / DP) - Python (0) | 2024.07.08 |
[BOJ / 백준] 1726 로봇 (G3 / BFS) - Python (0) | 2024.07.06 |
[BOJ / 백준] 11899 괄호 끼워넣기 (S3^ / Stack) - Python (0) | 2024.07.05 |