반응형
1932번: 정수 삼각형
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
www.acmicpc.net
보다 간단한 실버1 문제이다.
보자마자 Dynamic Programming로 풀면 몇 줄 안에 금방 짜질 것 같아서 그렇게 짰고, 1트만에 풀었다.
내가 생각한 알고리즘은 다음과 같다.
- 어차피 내 바로 위의 부모 2개의 노드 값 + 현재 값으로 비용을 체크할 것이다.
- 그렇다면 그냥 DP로, 내 현재 값 + 내 부모 중 한 명 값 을 두 번 계산해서 max값을 내놓는다면? 그게 답이 될 것이다.
- 여기서 고려할 점은, 입력받은 삼각형 안의 값들을 in-place하게 바꾸어주어도 문제가 되지 않는다는 점이다.
제출한 C++ 코드는 다음과 같다.
#include <iostream>
#include <algorithm>
#include <vector>
#define fastcpp ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
int n;
vector<int> dp[501];
int main() {
fastcpp;
cin >> n;
for (int i=1;i<=n;i++){
for (int j=0;j<i;j++) {
int dap;
cin >> dap;
dp[i].push_back(dap);
}
}
if (n==1) cout << dp[1][0];
else{
int ans = 0;
for (int i=2;i<=n;i++){
int len = dp[i-1].size();
for (int j=0;j<dp[i].size();j++){
int maxV = -1;
if (j-1>=0) maxV = dp[i][j]+dp[i-1][j-1];
if (j<len) maxV = (maxV==-1) ? dp[i][j]+dp[i-1][j] : max(maxV,dp[i][j]+dp[i-1][j]);
dp[i][j] = maxV;
ans = max(ans, maxV);
}
}
cout << ans;
}
return 0;
}
반응형
'백준 문제풀이 > 백준 Silver' 카테고리의 다른 글
백준 10844 - 쉬운 계단 수 [C/C++] (0) | 2023.11.16 |
---|---|
백준 2156 - 포도주 시식 [C/C++] (0) | 2023.11.16 |
백준 1149 - RGB거리 (1) | 2023.11.14 |
백준 20529 - 가장 가까운 세 사람의 심리적 거리 [C/C++] MBTI (0) | 2023.11.06 |
백준 1018 - 체스판 다시 칠하기 [Python] (0) | 2023.11.05 |