์ค๋ฒ1 : ๋์ ๊ณํ๋ฒ ๋ฌธ์ ์ด๋ค.
์๊ฐ
๋์ ๊ณํ๋ฒํ๋ฉด ์ ๋ช ํ ๋ฌธ์ ์ด๋ค. ๋๋ ๋์ ๊ณํ๋ฒ์ ํ ๋ ๋ณดํต ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ง์ด ์ฌ์ฉํ๋ค.
- ์ํ์ ๋ํ ์ ์์ ์ ํ์์ ์ง๊ด์ผ๋ก ๋๋ฆฐ๋ค. (
๊ฐ..) - ์์ฐจ์ ์ผ๋ก ์์ ํ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ทธ๋ ค๋ณธ๋ค.
๋ฌธ์ ๊ฐ ์ ์๋ณด์ด๋ฉด 2๋ฒ ๋ฐฉ๋ฒ์ ์ ํํ๋๋ฐ, ์ด ๋ฌธ์ ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
|1|2|
|:|:|
|R||
|G|R|
|B||
|R||
|G|G|
|B||
|R||
|G|B|
|B||
1๋ฒ ์ง์์ 2๋ฒ ์ง์ผ๋ก ๋์ด๊ฐ ๋, 2๋ฒ ์ง์ ์ ํ์ ๋ฐ๋ผ 1๋ฒ์ง์ ์ ํ์ 2๋ฒ ์ง์์ ์ ํํ ์์ ์ ์ธํ ๋๊ฐ์ง ์์ผ๋ก ์ ํด์ง๋ค. ์ฌ๊ธฐ์ Dp์ ์ ์ ๋ฐฉ๋ฒ์ ํน์ง์ด ๋๋ฌ๋๋๋ฐ, ์ฌ์ค ๋๋ ์ฒ์ ์๊ฐํ ๋, 1๋ฒ์ด ์ ํ์ ํ๊ณ , 2๋ฒ์ด ์ด๋ป๊ฒ ๋ฐ๋๋ ์ง๋ฅผ ์๊ฐํ๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ์ฝ๋๋ฅผ ์งค ๊ฒฝ์ฐ ๊ต์ฅํ ๊ท์ฐฎ๊ณ ์ด๋ ต๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. dp์ ์ ์๋ ํด๋น ์์น๊น์ง์ ์ด๋ค ์๋ฏธ๋ฅผ ์ฃผ๋ ๊ฒ์ด ๋ฌธ์ ๋ฅผ ํ์ดํ ๋ ํจ์ฌ ์์ํ๋ค. ์ด๊ฒ์ ์์ด์์ ์ผ๋ฐํญ์ ์ ์์ ๋น์ทํ๋ค.
์ ์
dp[N][color]
= N๋ฒ ์ง์ color๋ฅผ ์น ํ์ ๋ ๋ฐ์ํ๋ ์ต์ ๊ฐ
color ๋ณ์๋ฅผ ์ถ๊ฐํ ์ด์ ๋, ํด๋น ์ง์ ์ด๋ค ์์ ์น ํ๋์ ๋ฐ๋ฅธ ๊ฐ๊ฒฉ์ ๋ง์ง๋ง์ ์ต์ข ์ ์ผ๋ก ๋น๊ตํด์ฃผ๊ธฐ ์ํจ์ด๋ค.
์ ํ์
dp[N][color1] = min(dp[N-1][color2], dp[N-1][color3]) + cost[i][color1]
color2, color3
๋ color1์ด์ธ์ ๋ ์์ ์๋ฏธํ๋ค.
Code
#include <iostream>
#include <algorithm>
using namespace std;
int N = 0;
int cost[1001][3];
int dp[1001][3] = {0};
int main(){
cin >> N;
for (int i = 1; i <= N; i++)
for (int j = 0; j < 3; j++)
cin >> cost[i][j];
// ์ด๊ธฐ๊ฐ ์ธํ
for (int i = 0; i < 3; i++) dp[1][i] = cost[1][i];
// dp
for (int i = 2; i <= N; i++)
for (int j = 0; j < 3; j++)
dp[i][j] = min(dp[i-1][(j+1)%3], dp[i-1][(j+2)%3])+cost[i][j];
// ์ต์ข
์ ์ธ ์ต์๊ฐ
cout << *min_element(&dp[N][0], &dp[N][3]) << '\n';
return 0;
}