package task.easy.rgbstreet1149;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
Deque<int[]> dequeHouse = new ArrayDeque<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int red = Integer.parseInt(st.nextToken());
int green = Integer.parseInt(st.nextToken());
int blue = Integer.parseInt(st.nextToken());
dequeHouse.offer(new int[] {red, green, blue});
}
List<Integer> dp = new ArrayList<>();
int[] colorExpHouseArray = dequeHouse.poll();
for (int i = 0; i < 3; i++) {
dp.add(colorExpHouseArray[i]);
}
while (!dequeHouse.isEmpty()) {
int[] poll = dequeHouse.poll();
List<Integer> tmp = new ArrayList<>();
for (int i = 0; i < 3; i++) {
tmp.add(poll[i]);
}
int red = Math.min(dp.get(1), dp.get(2)) + tmp.get(0);
int green = Math.min(dp.get(0), dp.get(2)) + tmp.get(1);
int blue = Math.min(dp.get(0), dp.get(1)) + tmp.get(2);
// dp에 업데이트
dp.set(0, red);
dp.set(1, green);
dp.set(2, blue);
}
System.out.println(Collections.min(dp));
}
}
N의 red = N-1의 Min(green, blue) + N의 red
N의 green = N-1의 Min(red, blue) + N의 green
N의 blue = N-1의 Min(red, green) + N의 blue
중복 제거 성공. dp는 어떻게든 N과 N-1을 조사해서 중복을 제거할 궁리만 빡세게 하면 여럽지 않은 dp문제는 빠르게 아이디어를 얻을 수 있다.
즉 6개가 3개가 되므로 모든 경우의수를 조사했을 때 연산수인 32의1000승이 아니라 31000으로 바뀜.
원리만 알면 코드는 1분 컷. dp 아이디어 찾기 자체는 쉬웠다. dp문제는 복잡한 코딩인 문제가 없으므로 아이디어만 확정되면 코딩은 1분컷 가능.