문제링크 : https://www.acmicpc.net/problem/17404
17404번: RGB거리 2
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int N, result = MAX;
int arr[1001][3];
int dp[1001][3];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N;
for(int i=0; i<N; i++)
{
cin >> arr[i][0] >> arr[i][1] >> arr[i][2];
}
for(int i=0; i<3; i++) //시작 위치
{
for(int j=0; j<3; j++) //1번 집
{
if(j==i) dp[0][j] = arr[0][j]; //첫 줄 색깔 저장
else dp[0][j] = 1001; //이외는 선택 불가하도록 가장 큰 값으로 설정
}
for(int j=1; j<N; j++) //i번째 집
{
dp[j][0] = arr[j][0] + min(dp[j-1][1], dp[j-1][2]); //현재값 + 그전 값중 작은 값
dp[j][1] = arr[j][1] + min(dp[j-1][0], dp[j-1][2]);
dp[j][2] = arr[j][2] + min(dp[j-1][0], dp[j-1][1]);
}
for(int j=0; j<3; j++) //N번째 집
{
if(j==i) continue; //1번 집과 같으면 넘김
result = min(result, dp[N-1][j]);
}
}
cout << result;
return 0;
}
백준 1149번 문제인 RGB 거리 문제에서 업그레이된 문제이다.
맨 처음 첫 줄에 시작 위치를 정하고 시작한다.
3개 중에 하나를 정하고, 나머지 2개는 1001로 설정함으로써 이후 DP를 통해 탐색할때 선택되는 일이 없도록 한다.
i번째의 값은 현재 칸을 기준으로 그전 값 2개중에 작은 값을 선택하도록 해준다.
이를 N번째 값까지 쭉 계산을 진행해준다.
현재 칸 0 -> 선택 가능한 이전 칸 1, 2
현재 칸 1 -> 선택 가능한 이전 칸 0, 2
현재 칸 2 -> 선택 가능한 이전 칸 0, 1
N번째 집의 경우에는 1번째 집과 같으면 안된다는 조건이 있다.
따라서 마지막 3개의 칸에 대해 반복문을 돌리면서 1번째 집의 칸과 똑같은 경우에는 넘기고,
아닐 때에는 가장 작은 값을 result에 저장하도록 해준다.
'백준 > 골드' 카테고리의 다른 글
[백준 2580번] 스도쿠 (C++) (0) | 2023.09.11 |
---|---|
[백준 2239번] 스도쿠 (C++) (0) | 2023.09.10 |
[백준 1647번] 도시 분할 계획 (C++) (0) | 2023.09.08 |
[백준 14002번] 가장 긴 증가하는 부분 수열 4 (C++) (0) | 2023.09.07 |
[백준 1351번] 무한 수열 (C++) (0) | 2023.09.04 |