coding test - C++/기본기문제
[C++] 땅따먹기 - DP
sillon
2026. 10. 3. 18:57
728x90
반응형

땅따먹기
문제 유형
이 문제는 DP(동적 계획법) 문제다.
조건은 같은 열을 연속해서 선택할 수 없다는 것이다.
같은 행을 계속 밟을 수 없음 ❌
같은 열을 연속해서 선택할 수 없음 ✅
DP 상태
dp[i][j]를 다음과 같이 정의한다.
i번째 행에서 j번째 열을 선택했을 때 얻을 수 있는 최대 점수
점화식
현재 j번째 열을 선택하면 이전 행에서는 j가 아닌 열을 선택해야 한다.
dp[i][j] =
land[i][j] + 이전 행에서 j가 아닌 열의 최댓값
예를 들어 현재 j = 2열을 선택하면 이전 행에서는:
0열, 1열, 3열
중 하나를 선택해야 한다.
초기값
첫 번째 행은 이전 행이 없으므로 그대로 저장한다.
dp[0][j] = land[0][j];
풀이 코드
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> land) {
int n = land.size();
vector<vector<int>> dp(n, vector<int>(4, 0));
// 첫 번째 행
for (int j = 0; j < 4; j++) {
dp[0][j] = land[0][j];
}
// 두 번째 행부터 계산
for (int i = 1; i < n; i++) {
for (int j = 0; j < 4; j++) {
int best = 0;
for (int k = 0; k < 4; k++) {
if (k != j) {
best = max(best, dp[i - 1][k]);
}
}
dp[i][j] = land[i][j] + best;
}
}
// 마지막 행에서 가장 큰 값이 정답
return *max_element(dp[n - 1].begin(), dp[n - 1].end());
}728x90
반응형