DP(동적 프로그래밍) 로 풀었다.
dp[i][j] = max(dp[i-1][k]) + land[i][j] (단, j != k)
→ 이전 행에서 같은 열이 아닌 것 중 최댓값 + 현재 칸의 값
dp[i][j]: i행 j열을 선택했을 때 누적 최댓값dp[i-1][k])에서 현재 열과 다른 열(j != k) 중 최댓값을 선택import java.util.*;
class Solution {
int solution(int[][] land) {
int answer = 0;
int row = land.length;
int[][] dp = new int[row][4];
for (int i = 0; i < 4; i++) {
dp[0][i] = land[0][i];
}
for (int i = 1; i < row; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
if (j == k) continue;
dp[i][j] = Math.max(dp[i][j], dp[i-1][k] + land[i][j]);
}
}
}
for (int i = 0; i < 4; i++) {
answer = Math.max(answer, dp[row-1][i]);
}
return answer;
}
}
dp[i][j]에 누적 최댓값을 저장하는 방식으로 매 행마다 모든 경우를 다시 계산하지 않아도 된다.j != k)을 3중 반복문으로 자연스럽게 처리할 수 있었다.