https://school.programmers.co.kr/learn/courses/30/lessons/43105
1. 일반식을 정확하게 짜는방법
오류 : if(j==i)우측 끝일때 d[i][j]=d[i-1][i]
해결 : if(j==i)우측 끝일때 d[i][j]=d[i-1][i-1]
아래그림에서 d[0위치]=d[8위치]==d[i-1][i-1]이 되어야한다!
2. 전체코드
#include <bits/stdc++.h>
using namespace std;
int dp[504][504];
//1. d[i][j] : i높이에서 누적 최대합. / j번째 행에서
//d[0]=7
//d[1][0]=7+3
//d[1][1]=7+8
//d[2][0]=d[1][0]+score[2][0]
//d[2][1]=max(d[1][0], d[1][1])+score[2][1]
//d[2][2]=d[1][1]+score[2][2]
//2. d[i][j] = max(d[i-1][j-1],d[i-1][j])+score[k][i]
//단, i==0 -> d[i][j] =d[i-1][0]+score[i][j]
//단, i==n끝 -> d[i][j] =d[i-1][끝]+score[i][j]
//여기가 j-1이 되어야함!!!!!!!!!!!!!!
int solution(vector<vector<int>> triangle) {
int answer = 0;
int n = triangle.size();
dp[0][0] = triangle[0][0];
for(int i = 1; i<n; i++){
for(int j = 0; j<=i; j++){
if(j==0) dp[i][j] = dp[i-1][0] + triangle[i][j];
else if(j==i) dp[i][j] = dp[i-1][i-1] + triangle[i][j];
else{
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];
}
}
}
return *max_element(dp[n-1],dp[n-1]+n);
}
'Algorithm > dp' 카테고리의 다른 글
백준 11727 2*n 타일링2 c++ // dp (0) | 2023.10.10 |
---|---|
백준 1003 피보나치 함수 c++ // dp (0) | 2023.10.10 |
백준 12852 1로만들기 2 c++ // dp, 경로복원 하는 방법 pre[i] (0) | 2023.10.09 |
백준 11659 구간합구하기4 c++ // dp, dp를 사용해야할때 아는방법 (0) | 2023.10.09 |
백준 11726 2*n타일링 c++ // dp, 점화식세우기 (0) | 2023.10.09 |