𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 1932번: μ •μˆ˜ μ‚Όκ°ν˜• - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 1932번: μ •μˆ˜ μ‚Όκ°ν˜• - C++

.23 2022. 2. 10. 16:05
문제
        7
      3   8
    8   1   0
  2   7   4   4
4   5   2   6   5

μœ„ 그림은 크기가 5인 μ •μˆ˜ μ‚Όκ°ν˜•μ˜ ν•œ λͺ¨μŠ΅μ΄λ‹€.

맨 μœ„μΈ΅ 7λΆ€ν„° μ‹œμž‘ν•΄μ„œ μ•„λž˜μ— μžˆλŠ” 수 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜μ—¬ μ•„λž˜μΈ΅μœΌλ‘œ λ‚΄λ €μ˜¬ λ•Œ, μ΄μ œκΉŒμ§€ μ„ νƒλœ 수의 합이 μ΅œλŒ€κ°€ λ˜λŠ” 경둜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. μ•„λž˜μΈ΅μ— μžˆλŠ” μˆ˜λŠ” ν˜„μž¬ μΈ΅μ—μ„œ μ„ νƒλœ 수의 λŒ€κ°μ„  μ™Όμͺ½ λ˜λŠ” λŒ€κ°μ„  였λ₯Έμͺ½μ— μžˆλŠ” 것 μ€‘μ—μ„œλ§Œ 선택할 수 μžˆλ‹€.

μ‚Όκ°ν˜•μ˜ ν¬κΈ°λŠ” 1 이상 500 μ΄ν•˜μ΄λ‹€. μ‚Όκ°ν˜•μ„ 이루고 μžˆλŠ” 각 μˆ˜λŠ” λͺ¨λ‘ μ •μˆ˜μ΄λ©°, λ²”μœ„λŠ” 0 이상 9999 μ΄ν•˜μ΄λ‹€.

 

μž…λ ₯

첫째 쀄에 μ‚Όκ°ν˜•μ˜ 크기 n(1 ≤ n ≤ 500)이 주어지고, λ‘˜μ§Έ 쀄뢀터 n+1번째 μ€„κΉŒμ§€ μ •μˆ˜ μ‚Όκ°ν˜•μ΄ 주어진닀.

 

좜λ ₯

첫째 쀄에 ν•©μ΄ μ΅œλŒ€κ°€ λ˜λŠ” κ²½λ‘œμ— μžˆλŠ” 수의 합을 좜λ ₯ν•œλ‹€.


μ˜€λžœλ§Œμ— ν’€μ–΄λ΄€λ˜ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° 문제.

 

μ‚Όκ°ν˜•μ„ 이차원 λ°°μ—΄λ‘œ 생각해봀을 λ•Œ, (i, j) μœ„μΉ˜μ— μžˆλŠ” μˆ«μžλŠ” (i - 1, j - 1)μ΄λ‚˜ (i - 1, j)κΉŒμ§€μ˜ 합에 λ”ν•΄μ§ˆ 수 μžˆλ‹€. κ°€μž₯ 큰 합을 κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‘˜ 쀑에 더 큰 합에 더해주면 λœλ‹€. 이λ₯Ό μ‹μœΌλ‘œ 생각해보면 λ‹€μŒκ³Ό κ°™λ‹€.

 

triangle[i][j] = MAX(triangle[i - 1][j - 1], triangle[i - 1][j - 1])

 

jκ°€ λͺ¨μ„œλ¦¬μ— μœ„μΉ˜ν–ˆμ„ λ•Œμ˜ 경우만 λ”°λ‘œ 생각해주면(사싀 찾아보면 μΌ€μ΄μŠ€ λΆ„λ₯˜ μ•ˆν•˜κ³  더 κ°„λ‹¨ν•˜κ²Œ ν’€ 수 μžˆλŠ” 방법도 있음 γ… γ… ) 금방 ν’€ 수 있던 λ¬Έμ œμ˜€λ‹€.

 

λ¬Έμ œλŠ” bottom-up λ°©μ‹μœΌλ‘œ ν’€μ—ˆλ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MAX 501

int triangle[MAX][MAX];
int DP(int num);

int max(int a, int b) {
    return a > b ? a : b;
}

int main(void) {
    int n;
    scanf("%d", &n);

    for(int i = 0; i < n; i++) {
        for(int j = 0; j <= i; j++) {
            scanf("%d", &triangle[i][j]);
        }
    }

    printf("%d\n", DP(n));
    return 0;
}

int DP(int num) {
    int result = 0;
    
    for(int i = 0; i < num; i++) {
        for(int j = 0; j <= i; j++) {
            if(j == 0) {
                triangle[i][j] = triangle[i - 1][j] + triangle[i][j];
            }
            else if(j == i) {
                triangle[i][j] = triangle[i - 1][j - 1] + triangle[i][j];
            }
            else {
                triangle[i][j] = max(triangle[i - 1][j - 1], triangle[i - 1][j]) + triangle[i][j];
            }

            result = max(result, triangle[i][j]);
        }
    }

    return result;
}
Comments