https://www.acmicpc.net/problem/1149
dp는 나의 현재 값에서 그 전 값을 무엇을 가져와야 할 것인가로 식을 정하면 됨.
2839번을 그리디가 아니라 dp로 풀면서 아이디어 떠오름
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
// 그 전의 집의 색과 동일하지 않으면 됨
int[][] house = new int[n+1][3];
int[][] dp = new int[n+1][3];
for(int i=1;i<=n;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
house[i][0] = Integer.parseInt(st.nextToken());
house[i][1] = Integer.parseInt(st.nextToken());
house[i][2] = Integer.parseInt(st.nextToken());
}
dp[1][0] = house[1][0];
dp[1][1] = house[1][1];
dp[1][2] = house[1][2];
for(int i=2;i<=n;i++){
dp[i][0] = Math.min(dp[i-1][1]+house[i][0],dp[i-1][2]+house[i][0]);
dp[i][1] = Math.min(dp[i-1][0]+house[i][1],dp[i-1][2]+house[i][1]);
dp[i][2] = Math.min(dp[i-1][0]+house[i][2],dp[i-1][1]+house[i][2]);
}
if(dp[n][0]>=dp[n][1]){
System.out.println(Math.min(dp[n][1],dp[n][2]));
}else{
System.out.println(Math.min(dp[n][0],dp[n][2]));
}
}
}