컴퓨터과학/알고리즘_PS

[백준 / C++] 1932 - 정수 삼각형

MG# 2022. 6. 1. 13:31

https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net

한 숫자를 정했을 때 그 위의 두 경로 중 가장 최대값을 정하는 문제이다. 양 끝에 위치하는 숫자일 경우 바로 위 하나의 경로만 더하고 나머지 경우는 dp로 저장한 두 최대 경로 중 더 큰 값을 저장한다.

#include <iostream>
#include <vector>
#define MAX 501
using namespace std;

vector<int> v[MAX];
int dp[MAX][MAX];
int n, tmp, ans;

int main() {

    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            cin >> tmp;
            v[i].push_back(tmp);
        }
    }

    dp[0][0] = v[0][0];
    for (int i = 1; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0)
                dp[i][j] = dp[i - 1][j] + v[i][j];
            else if (j == i)
                dp[i][j] = dp[i - 1][j - 1] + v[i][j];
            else {
                dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + v[i][j];
            }
        }
    }

    ans = 0;
    for (int i = 0; i < n; i++)
        ans = max(ans, dp[n - 1][i]);

    cout << ans << "\n";
    return 0;
}
#include <iostream>
#include <vector>
#define MAX 501
using namespace std;

vector<int> v[MAX];
int dp[MAX][MAX];
int n, tmp, ans;

int main() {

    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            cin >> tmp;
            v[i].push_back(tmp);
        }
    }

    dp[0][0] = v[0][0];
    for (int i = 1; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0)
                dp[i][j] = dp[i - 1][j] + v[i][j];
            else if (j == i)
                dp[i][j] = dp[i - 1][j - 1] + v[i][j];
            else {
                dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + v[i][j];
            }
        }
    }

    ans = 0;
    for (int i = 0; i < n; i++)
        ans = max(ans, dp[n - 1][i]);

    cout << ans << "\n";
    return 0;
}