https://www.acmicpc.net/problem/17404
17404번: RGB거리 2
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
RGB거리 1과 유사한 문제지만
- 1번 집의 색은 2번, N번 집의 색과 같지 않아야 한다.
- N번 집의 색은 N-1번, 1번 집의 색과 같지 않아야 한다.
- i(2 ≤ i ≤ N-1)번 집의 색은 i-1, i+1번 집의 색과 같지 않아야 한다.
밑줄 친 부분의 조건이 추가되었다. 따라서 DP의 초깃값을 정할 수 없으므로 1번 집을 빨간색으로 고정, 초록색으로 고정, 파란색으로 고정하는 경우를 다 계산해주고 마지막 집은 1번 집과 같은 색이 될 수 없으므로 계산하지 않는다.
#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
#define vc vector<int>
#define F first
#define S second
using namespace std;
int dp[1001][4],RGB[1001][4];
int main() {
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,ans = INF;
cin >> n;
for(int i=1;i<=n;i++){
for(int j=0;j<3;j++)
cin >> RGB[i][j];
}
for(int k=0;k<=2;k++){
for(int i=0;i<=2;i++){
if(i == k) dp[1][i] = RGB[1][i];
else dp[1][i] = 1000 * 1000 + 1;
}
for(int i=2;i<=n;i++){
dp[i][0] = min(dp[i-1][1],dp[i-1][2]) + RGB[i][0];
dp[i][1] = min(dp[i-1][0],dp[i-1][2]) + RGB[i][1];
dp[i][2] = min(dp[i-1][0],dp[i-1][1]) + RGB[i][2];
}
for(int i=0;i<=2;i++){
if(i == k) continue;
ans = min(ans,dp[n][i]);
}
}
cout << ans;
}
'baekjoon' 카테고리의 다른 글
14499번 주사위 굴리기 (0) | 2022.03.31 |
---|---|
7662번 이중 우선순위 큐 (0) | 2022.03.29 |
2887번 행성 터널 (0) | 2022.03.27 |
4386번 별자리 만들기 (0) | 2022.03.25 |
1647번 도시 분할 계획 (0) | 2022.03.25 |