๊ท์น์ ๋์ ํ ์์๊ฐ ์์ด์ ํ์์๋ค๋ฉด 2์๊ฐ ์ด์ ๋ถ์ก๊ณ ์์ง ์๋๊ฒ ํ์คํ ์ข์ ์ต๊ด ๊ฐ๋ค.ํนํ DP๊ฐ์ ๊ฒฝ์ฐ๋ ๋ ๊ทธ๋ฐ๊ฒ ๊ฐ์.
๋ฌธ์ |
๋ฌธ์
์๊ทผ์ด์ ์ฌ๋์ ์๋ฅ์ด๋ ๋ฌธ๋ฐฉ๊ตฌ์์ ์คํฐ์ปค 2n๊ฐ๋ฅผ ๊ตฌ๋งคํ๋ค. ์คํฐ์ปค๋ ๊ทธ๋ฆผ (a)์ ๊ฐ์ด 2ํ n์ด๋ก ๋ฐฐ์น๋์ด ์๋ค. ์๋ฅ์ด๋ ์คํฐ์ปค๋ฅผ ์ด์ฉํด ์ฑ ์์ ๊พธ๋ฏธ๋ ค๊ณ ํ๋ค.
์๋ฅ์ด๊ฐ ๊ตฌ๋งคํ ์คํฐ์ปค์ ํ์ง์ ๋งค์ฐ ์ข์ง ์๋ค. ์คํฐ์ปค ํ ์ฅ์ ๋ผ๋ฉด, ๊ทธ ์คํฐ์ปค์ ๋ณ์ ๊ณต์ ํ๋ ์คํฐ์ปค๋ ๋ชจ๋ ์ฐข์ด์ ธ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ์ฆ, ๋ ์คํฐ์ปค์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์, ์๋์ ์๋ ์คํฐ์ปค๋ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
๋ชจ๋ ์คํฐ์ปค๋ฅผ ๋ถ์ผ ์ ์๊ฒ๋ ์๋ฅ์ด๋ ๊ฐ ์คํฐ์ปค์ ์ ์๋ฅผ ๋งค๊ธฐ๊ณ , ์ ์์ ํฉ์ด ์ต๋๊ฐ ๋๊ฒ ์คํฐ์ปค๋ฅผ ๋ผ์ด๋ด๋ ค๊ณ ํ๋ค. ๋จผ์ , ๊ทธ๋ฆผ (b)์ ๊ฐ์ด ๊ฐ ์คํฐ์ปค์ ์ ์๋ฅผ ๋งค๊ฒผ๋ค. ์๋ฅ์ด๊ฐ ๋ ์ ์๋ ์คํฐ์ปค์ ์ ์์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ฆ, 2n๊ฐ์ ์คํฐ์ปค ์ค์์ ์ ์์ ํฉ์ด ์ต๋๊ฐ ๋๋ฉด์ ์๋ก ๋ณ์ ๊ณต์ ํ์ง ์๋ ์คํฐ์ปค ์งํฉ์ ๊ตฌํด์ผ ํ๋ค.
์์ ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ์ ์ ์๊ฐ 50, 50, 100, 60์ธ ์คํฐ์ปค๋ฅผ ๊ณ ๋ฅด๋ฉด, ์ ์๋ 260์ด ๋๊ณ ์ด ๊ฒ์ด ์ต๋ ์ ์์ด๋ค. ๊ฐ์ฅ ๋์ ์ ์๋ฅผ ๊ฐ์ง๋ ๋ ์คํฐ์ปค (100๊ณผ 70)์ ๋ณ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์, ๋์์ ๋ ์ ์๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ n (1 โค n โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ ๋ ์ค์๋ n๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ ์๋ ๊ทธ ์์น์ ํด๋นํ๋ ์คํฐ์ปค์ ์ ์์ด๋ค. ์ฐ์ํ๋ ๋ ์ ์ ์ฌ์ด์๋ ๋น ์นธ์ด ํ๋ ์๋ค. ์ ์๋ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 100๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค ๋ง๋ค, 2n๊ฐ์ ์คํฐ์ปค ์ค์์ ๋ ๋ณ์ ๊ณต์ ํ์ง ์๋ ์คํฐ์ปค ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
ํ์ด๊ณผ์ |
(1)๊ท์น
- DP์ด๋ฏ๋ก ์ ํ์๊ณผ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด์ฉํด ์ค๋๋ค.
- [0][0]๋ฒ์งธ ์คํฐ์ปค ๋๋ [1][0]๋ฒ์งธ ๋ถํฐ ์์ํฉ๋๋ค.(์ ๋ ์ด ๊ท์น์ ๊ณ ๋ คํ์ง ์์์ ์ฝ์ง์..)
- ๋ผ์ด๋ผ ์คํฐ์ปค๋ ๊ฐ ๋ณ์ ๊ณต์ ํ์ง ์์ต๋๋ค.
(2)์์
๋จผ์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉฐ ๊ท์น์ ์ฐพ์๋ด ๋๋ค.
์๋๊ณผ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ ๋,
50 |
10 |
100 |
20 |
40 |
30 |
50 |
70 |
10 |
60 |
[0][0]๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ผ๋ฉด [0][1]๋ฒ์งธ์ [1][0]๋ฒ์งธ ์คํฐ์ปค๋ฅผ ์ธ์ ์๊ฒ ๋ฉ๋๋ค.
50 | 10 | 100 | 20 | 40 |
30 | 50 | 70 | 10 | 60 |
๋ฐ๋๋ก [1][0]๋ฒ์งธ ์คํฐ์ปค๋ฅผ ๋ผ๋ฉด [0][0]๋ฒ์งธ ์คํฐ์ปค์ [1][1]๋ฒ์งธ ์คํฐ์ปค๋ฅผ ์ธ์ ์๊ฒ ๋ฉ๋๋ค.
50 | 10 | 100 | 20 | 40 |
30 | 50 | 70 | 10 | 60 |
๊ฒฐ๊ตญ ์์์คํฐ์ปค๊ฐ ๋ญ๋์ ๋ฐ๋ผ ๋๊ฐ์ ์ผ๋ก๋ง ์งํ๋๋ฏ๋ก,
[0][0]์ผ๋ก ์์ํ์๋์, [1][0]์ผ๋ก ์์ํ์๋์ ๊ฐ ๋๊ฐ์ ์ ํฉ์ ๋จ์ํ ๊ตฌํด๋ณด๋ฉด
50 | 10 (30+10)= 40 | 100 (100+100) = 200 | 20 (110+20) = 130 | 40 (210+40) = 250 |
30 | 50 (50+50) = 100 | 70 (40+70) = 110 | 10 (200+10) = 210 | 60 (130+60) = 190 |
์ ๋ต์ธ 260์ด ๋์ค์ง ์๋๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด๋, 100์คํฐ์ปค์์ ๋ค์ ๋๊ฐ์ 10์คํฐ์ปค๊ฐ ์๋, ๋ค๋ค์ ๋๊ฐ์ 60์คํฐ์ปค๋ฅผ ๋ํ ๊ท์น์ ์๊ฐํด๋ด ๋๋ค.
200+60 = ์ ๋ต์ธ 260 ์ด๋ฏ๋ก
ํ์ฌ์คํฐ์ปค๊ฐ+(n-1)๋๊ฐ์ ์คํฐ์ปค์์ ํฉ ๊ทธ๋ฆฌ๊ณ
ํ์ฌ์คํฐ์ปค๊ฐ+(n-2)๋๊ฐ์ ์คํฐ์ปค์์ ํฉ ์ค ๋ ํฐ ์ชฝ์ด ๋ฐฐ์ด์ ์ ์ฅ๋๋ค๋ ๊ท์น์ ์ธ์๋ด ๋๋ค.
๋ค๋ฅธ ์์ ์ ์ด ๊ท์น์ ๋์ ํด ๋ด ๋๋ค.
(๊ธฐ์ธ์ ๊ธ์๋ (n-2)๋๊ฐ์ ์คํฐ์ปค์ ๊ฐ)
10 |
30 (20+30) = 50 |
10 (50+10) = 60 (20+10) = 30 |
50 (80+50) = 130 (50+50) = 100 |
100 (110+100) = 210 (80+100) = 180 |
20 (190+20) = 210 (110+20) = 130 |
40 (230+40) = 270 (190+40) = 230 |
20 |
40 (10+40) = 50 |
30 (50+30) = 80 (10+30) = 40 |
50 (60+50) = 110 (50+50) = 100 |
60 (130+60) = 190 (60+60) = 120 |
20 (210+20) = 230 (130+20) = 150 |
80 (210+80) = 290 (210+80) = 290 |
๊ท์น์ด ์ ์ฉ๋จ์ ํ์ธํ๊ณ ์ ํ์์ ๋ง๋ญ๋๋ค.
(d๋ ๋ฉ๋ชจ์ด์ ์ด์ , v๋ ์ผ์ด์ค๊ฐ ์ ๋ ฅ๋ ๋ฐฐ์ด ์ ๋๋ค)
i๊ฐ 0์ผ๊ฒฝ์ฐ
d[0][0] = v[0][0]
d[1][0] = v[1][0]
๋๋จธ์ง์ ๊ฒฝ์ฐ
d[0][i] = v[0][i] + d[1][i-1] ๋๋ d[0][i] = v[0][i] + d[1][i-2] ์ค ํฐ๊ฐ
d[1][i] = v[1][i] + d[0][i-1] ๋๋ d[1][i] = v[1][i] + d[0][i-2] ์ค ํฐ๊ฐ
์ด ๋ฉ๋๋ค.
(3)์ฝ๋
XOR์ฐ์ฐ์ ์ด์ฉํ์ฌ
memo[0][i] = max(v[0][i]+memo[1][i - 1], v[0][i]+memo[1][i - 2]);
memo[1][i] = max(v[1][i]+memo[0][i - 1], v[1][i]+memo[0][i - 2]);
๋
for (int j = 0; j < 2; j++)
memo[j][i] = v[j][i]+ max(memo[j ^ 1][i - 1], memo[j ^ 1][i - 2]); ๋ก ์์ฑํด ์ค๋๋ค.
#include <iostream> #include <vector> #include <algorithm> using namespace std; int memo[2][100001]; int main() { int T, N; cin >> T; while (T--) { cin >> N; vector<vector<int>> v(2, vector<int>(N, 0)); for (int i = 0; i < 2; i++) { for (int j = 0; j < N; j++) { int test; cin >> test; v[i][j] = test; } } for (int i = 0; i < N; i++){ if (i == 0) for (int j = 0; j < 2; j++) memo[j][i] = v[j][i]; else for (int j = 0; j < 2; j++) memo[j][i] = v[j][i]+ max(memo[j ^ 1][i - 1], memo[j ^ 1][i - 2]); } cout << max(memo[0][N - 1], memo[1][N - 1]) << endl; } return 0; } | cs |
'๐ค PS(Problem Solving) > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11053๋ฒ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด (0) | 2019.07.10 |
---|---|
[๋ฐฑ์ค] 2156๋ฒ - ํฌ๋์ฃผ ์์ (0) | 2019.07.09 |
[๋ฐฑ์ค] 2193๋ฒ - ์ด์น์ (0) | 2019.07.07 |
[๋ฐฑ์ค] 11057๋ฒ - ์ค๋ฅด๋ง ์ (0) | 2019.07.07 |
[๋ฐฑ์ค] 10844๋ฒ - ์ฌ์ด ๊ณ๋จ ์ (0) | 2019.07.05 |