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;
}
'Algorithm > dp' 카테고리의 다른 글
리트코드 322 코인변경 c++ // 동전dp복습, 리트코드 초기화주의 (0) | 2024.05.19 |
---|---|
리트코드 주식을사고파는가장좋은시기 c++ // 이분탐색(슬라이딩윈도)+그리디, dp (0) | 2024.05.18 |
프로그래머스 주사위고르기 c++ // 빡구현, 완탐, dp, 이분탐색, 발상 아이디어 (0) | 2024.05.08 |
백준 4811 알약 c++ // 재귀dp, 경우의수는 + (0) | 2024.04.30 |
백준 1103 게임 c++ // 경우의수 dp, 사이클검사방법 (0) | 2024.04.30 |