Algorithm/dp
백준 1932 정수삼각형 c++ // 재귀dp, 1,2,3,4..n 개 입력받는법
Mini_96
2024. 5. 8. 23:21
https://www.acmicpc.net/problem/1932
1. 1,2,3,4..n 개 입력받는법
int n; cin >> n;
for (int i = 1; i <= n; i++) { //높이
for (int j = 1; j <= i; j++) { //가로
cin >> dp[i][j];
}
}
j<=i 하면 되네???
2. 의사코드
1. 아래, 우아래 로 이동 하는 dfs
2. 그때 상태를 dp에저장 : 그상태일때 최대값
3. 기저사례1 : 정상적으로 n번째 노드에 노착
기저사례2 : x가 아래 그림과같이 빨간x쳐진곳으로 간경우 -> 비정상 -> 매우작은값을리턴시켜 배제시킴.
- 특징발견 : x>y인 경우가 그러함.
3. 전체코드
#include <bits/stdc++.h>
using namespace std;
int n,m,a[504][504];
int dp[504][504];
//상태 : 좌표 : 그때 합 최대값
int dfs(int y, int x) {
if (y >= n) {
return 0;
}
if (x > y) { //정상경로가 아닌경우 배제
return -1e9;
}
if (dp[y][x]!=-1) return dp[y][x];
dp[y][x] = 0;
dp[y][x] = max(dfs(y + 1, x)+a[y+1][x], dfs(y + 1, x + 1) + a[y + 1][x+1]);
return dp[y][x];
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n;
m = 1;
memset(dp, -1, sizeof(dp));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m && m<=n; ++j) {
cin >> a[i][j];
}
m++;
}
/* for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << a[i][j] << " ";
}cout << "\n";
}*/
cout << dfs(0, 0) + a[0][0];
return 0;
}