๊ธฐ์กด RGB๊ฑฐ๋ฆฌ ๋ฌธ์ ์ ๊ฐํํ. ๊ทธ๋๋ ์ต๊ทผ DP ์งฌ๋ฐฅ์ด ์์ด์ ๊ทธ๋ฐ์ง ์ฒ์์ ๋งํ์ด๋ ํํธ ์๋ณด๊ณ ์ต์ข ํ์ด์ ์ฑ๊ณตํ๋ค. ํ์ด ๋ฐฉ์์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ด ๋ณด์ด๋๋ฐ, ๋๋ DP ์ฐจ์์ ํ์ฅํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ๋ค.
DP[sc][c][i] // ์์ color๊ฐ sc์ด๊ณ , i์ง์ ์ c๋ก ์น ํ์ ๋์ ๋น์ฉ ์ต์๊ฐ
์ด๋ ๊ฒ ์ ์ํด๋๊ณ , 1
, 2
๋ ๋ฏธ๋ฆฌ ๊ณ์ฐํด๋๊ณ N-1
๊น์ง ์ด์ ์ขํ๋ง ๋ณด๋ฉด์ ๊ตฌํ ๋ค์์, N
๋ฒ์งธ๋ ๊ฐ์ด ํ์ ๋จ์ ์ด์ฉํด์ ๊ตฌํ๋ค. (N๋ฒ์งธ๋ sc์์ ์ด ์๊ณผ, N-1์์ ์ด ๋ ์์ ์ฌ์ฉํ ์ ์๋ค)
๋ฌผ๋ก , 2
๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ ๋, DP[0][0][2]
๊ณผ ๊ฐ์ ๊ฐ์ ์กด์ฌํ ์ ์๋ค. ์ด๋ด ๊ฒฝ์ฐ ํฐ ๊ฐ์ ๋ฃ์ด๋์ด์ ์คํตํ๊ฒ ๋ง๋ค์ด์ผ๊ฒ ๋ค. (์ต์ข
๊ฒฐ๊ณผ๊ฐ ์ต์๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ฏ๋ก ๋ฌด์๋ ์ ์๋๋ก)
๋, ๋์ค์ ๋ค๋ฅธ ์ฌ๋๋ค ํ์ด๋ฅผ ๋ณด๋ sc
๋ฅผ ์์ ๊ณ , ์ ์ฒด loop์ ์ธ๋ฒ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ๋ ์๋๋ผ. ์ด๊ฑด ์ฐธ๊ณ .
#include <bits/stdc++.h>using namespace std;int DP[3][3][1001];int main() {int N; scanf("%d", &N);int cost[3][1001];for(int i = 1; i <= N; ++i) {int r, g, b;scanf("%d %d %d", &r, &g, &b);cost[0][i] = r;cost[1][i] = g;cost[2][i] = b;}// DP[sc][c][i] // 1์์น์ ์์์ด sc์ด๋ฉฐ, ์์ c๋ก i๋ฒ์งธ๋ฅผ ์น ํ์ ๋์ ๋น์ฉ์ ์ต์๊ฐDP[0][0][2] = 0x4FFFFFFF; // ๋ถ๊ฐ๋ฅํ caseDP[1][1][2] = 0x4FFFFFFF;DP[2][2][2] = 0x4FFFFFFF;DP[0][1][2] = cost[0][1] + cost[1][2];DP[0][2][2] = cost[0][1] + cost[2][2];DP[1][0][2] = cost[1][1] + cost[0][2];DP[1][2][2] = cost[1][1] + cost[2][2];DP[2][0][2] = cost[2][1] + cost[0][2];DP[2][1][2] = cost[2][1] + cost[1][2];// 2~N-1๊น์ง ๋ณด๊ณ ,// N๋ฒ์งธ์ ๊ฒฝ์ฐ N-1๊ณผ 1์ ๋์์ ๋ณด๊ณ ์ ํํ๋ค. (์ฌ์ค ์ ํ์ ์ฌ์ง๊ฐ ์์)for(int sc = 0; sc < 3; ++sc) {for(int i = 3; i <= N-1; ++i) {for(int c = 0; c < 3; ++c) {int v1 = cost[c][i] + DP[sc][(c+1)%3][i - 1];int v2 = cost[c][i] + DP[sc][(c+2)%3][i - 1];DP[sc][c][i] = min(v1, v2);}}}// N ์์น๋ฅผ ์ฑ์ด๋ค.DP[0][0][N] = 0x4FFFFFFF;DP[1][1][N] = 0x4FFFFFFF;DP[2][2][N] = 0x4FFFFFFF;DP[0][1][N] = min(DP[0][0][N-1], DP[0][2][N-1]) + cost[1][N];DP[0][2][N] = min(DP[0][0][N-1], DP[0][1][N-1]) + cost[2][N];DP[1][0][N] = min(DP[1][1][N-1], DP[1][2][N-1]) + cost[0][N];DP[1][2][N] = min(DP[1][0][N-1], DP[1][1][N-1]) + cost[2][N];DP[2][0][N] = min(DP[2][1][N-1], DP[2][2][N-1]) + cost[0][N];DP[2][1][N] = min(DP[2][0][N-1], DP[2][2][N-1]) + cost[1][N];int min = 0x7FFFFFFF;for(int i = 0; i < 3; ++i) {for(int j = 0; j < 3; ++j) {if (DP[i][j][N] < min) min = DP[i][j][N];}}printf("%d\n", min);return 0;}