C++/코드트리 챌린지
[코드트리 챌린지] 3주차 DP l - 격자 안에서 한 칸씩 전진하는 DP / 정수 사각형 최소 합
tmd1
2023. 9. 25. 17:17
https://www.codetree.ai/missions/2/problems/minimum-sum-path-in-square/description
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
코드:
#include <bits/stdc++.h>
using namespace std;
int n;
int arr[105][105]; // 행렬 저장용
int dp[105][105]; // 숫자 합 dp
void Initialize() {
// dp 초기값 설정
dp[0][n-1] = arr[0][n-1];
// 첫 번째 줄 가로, 세로를 채우는 방법은 하나밖에 없으므로
// 모두 채움
for (int i = 1; i < n; i++) {
dp[i][n - 1] = dp[i - 1][n - 1] + arr[i][n - 1];
}
for (int i = n-2; i >= 0; i--) {
dp[0][i] = dp[0][i + 1] + arr[0][i];
}
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> arr[i][j];
}
}
Initialize();
/*
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << dp[i][j] << " ";
}
cout << "\n";
}
*/
// 위, 우측중 어느 부분에서 내려와야 값이 작아지는지 판단하여 저장
for (int i = 1; i < n; i++) {
for (int j = n-2; j >= 0; j--) {
dp[i][j] = min(dp[i - 1][j], dp[i][j + 1]) + arr[i][j];
}
}
cout << dp[n - 1][0];
}
n을 입력받아 n x n 행렬을 채우도록 합니다.
Initialize() 함수를 통해 초기값을 설정합니다.
dp[0][n-1]이나 dp[0][i] , dp[i][n-1] 같은 경우 쭉 왼쪽으로 진행하거나 아래로 진행하는 방법 밖에
존재하지 않으므로 for문을 통해 dp 배열을 채우도록 합니다.
그 후 이중 for문을 통해 왼쪽에서 와야 작은지 위쪽에서 와야 값이 작아지는지 비교하여 dp 배열을 채우도록 합니다.
dp[n-1][0]을 출력합니다.