7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
(인지 모르겠지만 그냥 노드라고 하자...)
에 연결된 노드는 2개다. 그 두 개중 더 큰 수를 고르면 된다. 어차피 자기 자신은 똑같이 더하니까(i,j)
와 연관된 노드는 (i-1, j)
와 (i-1, j-1)
이다.(i-1, j-1)
가 없고 마지막 노드는 (i-1, j)
가 없다.(정확히는 0으로 초기화했다.)
그래서 마지막 노드의 (i-1, j)
0이고 max에서 알아서 걸러질 거라서 if 처리할 필요가 없어졌다.if
와 else if
그리고 else
를 써줘야 했던게 다 사라졌다.인생
#include <iostream>
#include <algorithm>
using namespace std;
int arr[500][500] = { 0 }, dp[500][500] = { 0 };
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++){
for (int j = 0; j <= i; j++) {
scanf_s("%d", &arr[i][j]);
}
}
dp[0][0] = arr[0][0];
for (int i = 1; i < n; i++) {
dp[i][0] = dp[i - 1][0] + arr[i][0];
for (int j = 1; j <= i; j++) {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + arr[i][j];
}
}
int maxValue = 0;
for (int i = 0; i < n; i++) {
maxValue = max(dp[n - 1][i], maxValue);
}
cout << maxValue << endl;
}
#include <vector>
#include <algorithm>
using namespace std;
int dp[500][500];
int solution(vector<vector<int>> triangle) {
int answer = 0;
dp[0][0] = triangle[0][0];
for(int i=1; i<triangle.size(); i++){
dp[i][0] = dp[i-1][0] + triangle[i][0];
for(int j=1; j<triangle[i].size(); j++){
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];
}
}
int last_col = triangle.size() -1;
for(int i=0; i<triangle[last_col].size(); i++){
answer = max(answer, dp[last_col][i]);
}
return answer;
}