• toc {:toc}

문제 ν™•μΈν•˜κΈ°

풀이

μ΅œλŒ“κ°’μ„ 찾을 수 μžˆλŠ” μ‚Όκ°ν˜•μ˜ κ·œμΉ™μ„ 생각해본닀.

μœ„μ—μ„œλΆ€ν„° 맨 λ§ˆμ§€λ§‰ μΈ΅κΉŒμ§€ λ‚΄λ €κ°€λ©΄μ„œ 선택할 수 μžˆλŠ” κ°’ 쀑 높은 값을 더해주면 맨 λ§ˆμ§€λ§‰μ— μžˆλŠ” 값은 각 루트둜 더할 수 μžˆλŠ” μ΅œλŒ“κ°’μ΄ λœλ‹€.

λ•Œλ¬Έμ— 맨 λ§ˆμ§€λ§‰ 측의 κ°’ 쀑 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λ©΄ ν•΄λ‹Ή 값이 μ΅œλŒ€κ°€ λ˜λŠ” κ²½λ‘œμ— μžˆλŠ” 수의 합이닀.

  • μ˜ˆμ‹œ 7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5
λˆ„μ ν•© μ˜ˆμ‹œ
dp[1][0] = dp[0][0] + dp[1][0] = 7 + 3, dp[1][1] = dp[0][0] + dp[1][1] = 7 + 8
dp[2][0] = dp[1][0] + dp[2][0] = 7+3+8, dp[2][2] = dp[1][1] + dp[2][2] = 7+8+0
dp[2][1] = max(dp[1][0], dp[1][1]) + dp[2][1] ...

즉, μ™Όμͺ½, 였λ₯Έμͺ½ κ°€μž₯μžλ¦¬μ— μœ„μΉ˜ν•œ 경우 λ‚΄κ°€ λ„˜κ²¨ 받을 수 μžˆλŠ” 값이 ν•œ κ°€μ§€ 밖에 μ—†κ³ , 쀑간에 μœ„μΉ˜ν•œ 경우 μ™Όμͺ½ λŒ€κ°, 였λ₯Έμͺ½ λŒ€κ°μ˜ 값을 λ„˜κ²¨ 받을 수 있기 λ•Œλ¬Έμ— λ‘˜ 쀑 큰 κ°’μœΌλ‘œ λ„˜κ²¨ λ°›μ•„ μ΅œλŒ€ 경둜λ₯Ό μ°ΎλŠ”λ‹€.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
int dp[501][501] = {0,};
int n, maxNum=0;
 
int main(){
    ios::sync_with_stdio(false);
    using namespace std;
 
    cin >> n;
 
    int val;
    for(int i=0; i<n; i++){
        for(int j=0; j<=i; j++){
            cin >> val;
            dp[i][j] = val;
        }
    }
 
    if(n == 1){
        cout << dp[0][0];
        exit(0);
    }
 
    for(int depth=1; depth<n; depth++){
        for(int idx=0; idx<=depth; idx++){
            if(idx == depth)
                dp[depth][idx] = dp[depth-1][idx-1] + dp[depth][idx];
            else if(idx == 0)
                dp[depth][idx] = dp[depth-1][idx] + dp[depth][idx];
            else
                dp[depth][idx] = max(dp[depth-1][idx], dp[depth-1][idx-1]) + dp[depth][idx];
            
            maxNum = max(maxNum, dp[depth][idx]);
        }
    }
 
    cout << maxNum << '\n';
 
    return 0;
}