[c++] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต 1๊ถŒ :: ์‚ผ๊ฐํ˜• ์œ„์˜ ์ตœ๋Œ€ ๊ฒฝ๋กœ (๋ฌธ์ œ ID: TRIANGLEPATH, ๋‚œ์ด๋„ : ํ•˜)
 

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๊ฐ’์„ ์กฐ์ •ํ•จ์œผ๋กœ์จ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ €๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

๋ฐ˜์‘ํ˜•