RGB๊ฑฐ๋ฆฌ(๋ฌธ์ _ 1149)
RGB๊ฑฐ๋ฆฌ์๋ ์ง์ด N๊ฐ ์๋ค. ๊ฑฐ๋ฆฌ๋ ์ ๋ถ์ผ๋ก ๋ํ๋ผ ์ ์๊ณ , 1๋ฒ ์ง๋ถํฐ N๋ฒ ์ง์ด ์์๋๋ก ์๋ค.
์ง์ ๋นจ๊ฐ, ์ด๋ก, ํ๋ ์ค ํ๋์ ์์ผ๋ก ์น ํด์ผ ํ๋ค. ๊ฐ๊ฐ์ ์ง์ ๋นจ๊ฐ, ์ด๋ก, ํ๋์ผ๋ก ์น ํ๋ ๋น์ฉ์ด ์ฃผ์ด์ก์ ๋, ์๋ ๊ท์น์ ๋ง์กฑํ๋ฉด์ ๋ชจ๋ ์ง์ ์น ํ๋ ๋น์ฉ์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
- 1๋ฒ ์ง์ ์์ 2๋ฒ ์ง์ ์๊ณผ ๊ฐ์ง ์์์ผ ํ๋ค.
- N๋ฒ ์ง์ ์์ N-1๋ฒ ์ง์ ์๊ณผ ๊ฐ์ง ์์์ผ ํ๋ค.
- i(2 ≤ i ≤ N-1)๋ฒ ์ง์ ์์ i-1๋ฒ, i+1๋ฒ ์ง์ ์๊ณผ ๊ฐ์ง ์์์ผ ํ๋ค.
์
๋ ฅ
์ฒซ์งธ ์ค์ ์ง์ ์ N(2 ≤ N ≤ 1,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฐ ์ง์ ๋นจ๊ฐ, ์ด๋ก, ํ๋์ผ๋ก ์น ํ๋ ๋น์ฉ์ด 1๋ฒ ์ง๋ถํฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ์ง์ ์น ํ๋ ๋น์ฉ์ 1,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ชจ๋ ์ง์ ์น ํ๋ ๋น์ฉ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
3
26 40 83
49 60 57
13 89 99
answer : 96
ํ์ด
<dp ๋ฌธ์ >
i๋ฒ์งธ ์ง์ ๋นจ๊ฐ์, ์ด๋ก์, ํ๋์์ผ๋ก ์น ํ ๋์ ์ต์๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค.
i๋ฒ์งธ ์ง์ ์น ํ ๋๋ i-1๋ฒ์งธ ์ง์ด ์น ํด์ง ๊ฐ + ํ์ฌ ์น ํ๋ ๊ฐ(๋นจ/์ด/ํ)์ด ๋ค๊ธฐ ๋๋ฌธ์ dp[i-1]๊ฐ + arr[i]๋ฅผ ํ๋ฉด ๋๋ค.
ํ์ง๋ง ์ด๋ฒ ๋ฌธ์ ์์๋ i๋ฒ์งธ ์ง์ ์ด์๋ ์ง๊ณผ ์์ด ๊ฐ์ผ๋ฉด ์๋๋ค๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์ 3์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํด ๊ณ์ฐํด์ผ ํ๋ค.
์ฆ,
dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + arr[i][0]; // ๋นจ๊ฐ์์ผ๋ก ์น ํ ๊ฒฝ์ฐ
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + arr[i][1]; // ์ด๋ก์์ผ๋ก ์น ํ ๊ฒฝ์ฐ
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + arr[i][2]; // ํ๋์์ผ๋ก ์น ํ ๊ฒฝ์ฐ
i๋ฒ์งธ ์ง์ ๋นจ๊ฐ์์ผ๋ก ์น ํ ๊ฒฝ์ฐ๋ i-1๋ฒ์งธ ์ง์ (ํ,์ด) ๋ก ์น ํ์ ๊ฒฝ์ฐ๋ง ์น ํ ์ ์๋ค.
i๋ฒ์งธ ์ง์ ์ด๋ก์์ผ๋ก ์น ํ ๊ฒฝ์ฐ๋ i-1๋ฒ์งธ ์ง์ (๋นจ,ํ) ๋ก ์น ํ์ ๊ฒฝ์ฐ๋ง ์น ํ ์ ์๋ค.
i๋ฒ์งธ ์ง์ ํ๋์์ผ๋ก ์น ํ ๊ฒฝ์ฐ๋ i-1๋ฒ์งธ ์ง์ (๋นจ,์ด) ๋ก ์น ํ์ ๊ฒฝ์ฐ๋ง ์น ํ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ต์๊ฐ์ ๊ณ์ฐํ ๋๋ i-1๋ฒ์งธ ์ง์ ์ผ๋ถ ์๊น์ ๊ฐ๋ง ์ด์ฉํด์ ๊ณ์ฐํ๋ค.
์ฝ๋
int arr[1001][3];
int dp[1001][3]; // i๋ฒ์งธ ์ง์ด ๋นจ,์ด,ํ๋ก ์น ํ์ ๋์ ์ต์๊ฐ
int n;
int main() {
ios::sync_with_stdio(0);
cout.tie(0); cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) // ๋นจ, ์ด, ํ
{
cin >> arr[i][0] >> arr[i][1] >> arr[i][2];
}
dp[0][0] = arr[0][0]; dp[0][1] = arr[0][1]; dp[0][2] = arr[0][2];
for (int i = 1; i < n; i++)
{
dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + arr[i][0]; // ๋นจ๊ฐ์์ผ๋ก ์น ํ ๊ฒฝ์ฐ
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + arr[i][1]; // ์ด๋ก์์ผ๋ก ์น ํ ๊ฒฝ์ฐ
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + arr[i][2]; // ํ๋์์ผ๋ก ์น ํ ๊ฒฝ์ฐ
}
cout << min({ dp[n - 1][0],dp[n - 1][1],dp[n - 1][2] });
}