728x90
728x90
https://www.acmicpc.net/problem/1932
문제
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번째 줄까지 정수 삼각형이 주어진다.
출력
첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.
풀이
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
위에서부터
dp[0][0] = 7
dp[1][0] = dp[0][0] + 3
dp[1][1] = dp[0][0] + 8
dp[2][0] = dp[1][0] + 8
dp[2][1] = max(dp[1][0],dp[1][1])+1
dp[2][2] = dp[1][1] + 0
dp[3][0] = dp[2][0] + 2
dp[3][1] = max(dp[2][0],dp[2][1])+7
dp[3][2] = max(dp[2][1],dp[2][2])+4
dp[3][3] = dp[2][2]+ 4
...
i가 행 , j가 열이라고 했을 때
- 각 행의 첫번째 값은 전 행의 첫번째 값 + 현재 칸의 값
- 각 행의 마지막 값은 전 행의 j-1열 값 + 현재 칸의 값
- 나머지 값들은 대각선 오른쪽 또는 대각선 왼쪽 값 중에서 큰 값과 현재 칸의 칸을 더해주면 된다
이렇게 하면 마지막 줄에 각각의 최대값이 저장되는데 그 중에서 제일 큰 것을 고르면 된다!
#include <bits/stdc++.h>
using namespace std;
vector <vector<int>> v(501, vector<int>(501, 0)); // 삼각형
vector <vector<int>> dp(501, vector<int>(501, 0)); // dp
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int num; cin >> num; // 삼각형의 크기
if (num == 1) { // num이 1일 경우
int tmp; cin >> tmp;
cout << tmp << '\n';
return 0;
}
//초기화
for (int i = 1; i <=num; i++) {
for (int j = 1; j <= i; j++) {
int tmp; cin >> tmp;
v[i][j] = tmp;
}
}
// 초기값 설정
dp[2][1] = v[1][1] + v[2][1];
dp[2][2] = v[1][1] + v[2][2];
for (int i = 3; i <= num; i++) {
for (int j = 1; j <= i; j++) {
if (j == 1 ) { // 첫번째 값일 경우
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];
}
}
}
// max 값 구하기
int max = dp[num][1];
for (int i = 2; i <= num; i++) {
if (max < dp[num][i]) {
max = dp[num][i];
}
}
cout << max << '\n';
return 0;
} //main
728x90
728x90
'Algorihtm > BOJ' 카테고리의 다른 글
C++ 백준 1449번 : 수리공 항승 (0) | 2023.02.15 |
---|---|
C++ 백준 16435번 : 스네이크버드 (0) | 2023.02.13 |
C++ 백준 1439번 : 뒤집기 (0) | 2023.02.09 |
C++ 백준 25391번: 특별상 (0) | 2023.02.05 |
C++ 백준 2630번 : 색종이 만들기 (0) | 2023.02.03 |