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

 

1932번: 정수 삼각형

문제 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. 삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는

www.acmicpc.net

이런 종류의 트래킹 문제는 확실히 DP가 좋은 해결법이다. 이거 백트래킹하면 100개 사이즈 정도만 되도 시간 초과가 발생할 것이다. 

 

더보기
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<vector<long>> arr;
    vector<vector<long>> dpcnt;
    int n;
    cin >> n;
    arr.resize(n + 1);    
    dpcnt.resize(n + 1);
    for (int i = 1; i <= n; i++) {
        arr[i].resize(i + 1);
        dpcnt[i].resize(i + 1);
        for (int j = 1; j <= i; j++) {
            cin >> arr[i][j];
            dpcnt[i][j] = -1;
        }
    }    

    for (int i = 1; i <= n; i++) {
        dpcnt[n][i] = arr[n][i];
    }

    for (int i = n - 1; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            int s1 = dpcnt[i + 1][j] + arr[i][j];
            int s2 = dpcnt[i + 1][j + 1] + arr[i][j];
            int s = (s1 > s2 ? s1 : s2);
            if (dpcnt[i][j] < s) dpcnt[i][j] = s;
        }
    }

    cout << dpcnt[1][1] << endl;
    /*for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n-i; j++) {
            cout << " ";
        }
        for (int j = 1; j <= i; j++) {
            cout << dpcnt[i][j] << " ";
        }
        cout << endl;
    }*/
    return 0;
}