https://www.algospot.com/judge/problem/read/TRIANGLEPATH
๋ฌธ์
6
1 2
3 7 4
9 4 1 7
2 7 5 9 4
์ ํํ์ ๊ฐ์ด ์ผ๊ฐํ ๋ชจ์์ผ๋ก ๋ฐฐ์น๋ ์์ฐ์๋ค์ด ์์ต๋๋ค. ๋งจ ์์ ์ซ์์์ ์์ํด, ํ ๋ฒ์ ํ ์นธ์ฉ ์๋๋ก ๋ด๋ ค๊ฐ ๋งจ ์๋ ์ค๋ก ๋ด๋ ค๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค. ๊ฒฝ๋ก๋ ์๋ ์ค๋ก ๋ด๋ ค๊ฐ ๋๋ง๋ค ๋ฐ๋ก ์๋ ์ซ์, ํน์ ์ค๋ฅธ์ชฝ ์๋ ์ซ์๋ก ๋ด๋ ค๊ฐ ์ ์์ต๋๋ค. ์ด ๋ ๋ชจ๋ ๊ฒฝ๋ก ์ค ํฌํจ๋ ์ซ์์ ์ต๋ ํฉ์ ์ฐพ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ์ C(C <= 50)๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์๋ ์ผ๊ฐํ์ ํฌ๊ธฐ n(2 <= n <= 100)์ด ์ฃผ์ด์ง๊ณ , ๊ทธ ํ n์ค์๋ ๊ฐ 1๊ฐ~n๊ฐ์ ์ซ์๋ก ์ผ๊ฐํ ๊ฐ ๊ฐ๋ก์ค์ ์๋ ์ซ์๊ฐ ์ผ์ชฝ๋ถํฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ์ซ์๋ 1 ์ด์ 100000 ์ดํ์ ์์ฐ์์ ๋๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ํ ์ค์ ์ต๋ ๊ฒฝ๋ก์ ์ซ์ ํฉ์ ์ถ๋ ฅํฉ๋๋ค.
์์ ์ ๋ ฅ
2
5
6
1 2
3 7 4
9 4 1 7
2 7 5 9 4
5
1
2 4
8 16 8
32 64 32 64
128 256 128 256 128
์์ ์ถ๋ ฅ
28
341
๋์ ๋ต
<์๊ฐ์ ํ๋ฆ>
์์ ํ์ => ๋์ ๊ณํ๋ฒ
์๋๋ก ์ด๋ํ ๋ ์๋์ชฝ, ์ค๋ฅธ์ชฝ ๋๊ฐ์ ์๋ ์ด๋ ๊ฒ 2๊ตฐ๋ฐ๋ก ์ด๋ํ๋ฏ๋ก ์ฌ๊ทํจ์๋ก ๊ตฌํํ์ฌ ์์ ํ์ํ ์ ์๋ค. ์ด ๋, ์์ ํ์์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ์ด๋ณด๋ฉด 2^(n+1) ์ด๋ฏ๋ก ๋น์ฐํ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค. ์ฃผ์ด์ง ์์ ๋ก ๋ฐ๋ผ ์จ๋ณด๋ฉด ๊ฒน์น๋ ๊ตฌ๊ฐ์ด ๋ง์๋ฐ, ์ค๋ณต์ ๋นผ๋ฉด n(n+1)/2์ ์ฌ๊ท๋ง ์คํํ๋ฉด ๋๋ฏ๋ก ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด์ฉํ๋ฉด O(n^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
<์ฝ๋>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int arr[5051];
int memorize[5051]; // ๋ฉ๋ชจ์ด์ ์ด์
// ํด๋น ์์น์ ์ ์ฅ๋ ์ ์๋ ์ต๋๊ฐ
int calMaxSum(int row, int idx) { // row : ์ค(ํ), idx : arr์์์ index
if (memorize[idx] != -1) // ์ด๋ฏธ ๋ค๋ฅธ ๊ณณ์ด๋ฉด
return memorize[idx];
if (row == n - 1) { // ๋ง์ง๋ง ์ค์ด๋ฉด
memorize[idx] = arr[idx];
return arr[idx];
}
// ๋ง์ง๋ง ์ค์ด ์๋๋ฉด ์๋์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์๋์์ ์ค๋ ๊ฐ ์ค ํฐ ๊ฐ์ผ๋ก return
int tmp1 = arr[idx] + calMaxSum(row + 1, idx + row+1);
int tmp2 = arr[idx] + calMaxSum(row + 1, idx + row+2);
int max = tmp1 > tmp2 ? tmp1 : tmp2;
memorize[idx] = max;
return max;
}
int main() {
int C;
cin >> C;
while (C--) {
cin >> n;
int index = 0;
for (int i = 0; i < n; i++) {
for(int j=0; j<=i; j++){
cin >> arr[index++];
}
}
fill_n(&memorize[0], 5051, -1);
cout << calMaxSum(0, 0)<<endl;
}
}
๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์ด๋ฐ ์์ด๋ค.
๋๋ฒ์งธ ๊ทธ๋ฆผ์ ํ์๋ ๊ฒ์ฒ๋ผ ๋ง์ง๋ง ์ค์ด ์๋ ์์น๋ฅผ ์กฐ์ฌํ ๋์๋ ์๋์ชฝ(2)๊ณผ ์ค๋ฅธ์ชฝ ์๋(7)๋ฅผ ์กฐ์ฌํด์ ์กด์ฌํ ์ ์๋ ๋ ํฐ ์๋ฅผ ์ ์ฅํ๋ค. ์ด๋ฐ์์ผ๋ก ์ฌ๊ท๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋ฉด ๋ง์ง๋ง ๊ทธ๋ฆผ์ memorize ๋ฐฐ์ด์ด ์์ฑ๋๊ณ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๊ฐ์ด ๊ฒฐ๊ณผ์ด๋ค.
๊ทธ๋ฆผ์์๋ ๋ชจ์์ ์ ๋ ๊ฒ ํํํ์ง๋ง ์ค์ ๋ก๋ 1์ฐจ์ ๋ฐฐ์ด์ ๊ฐ๋ค์ด ๋ค์ด๊ฐ ์๊ณ , index๊ฐ์ ์กฐ์ ํจ์ผ๋ก์จ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ ๋ฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์๋ค.
Comment