dp[i][j] => i번째 집을 j색으로 칠한 경우
#include <iostream>
using namespace std;
int N; //집의 수, 1000보다 작거나 같다
int _min(int a, int b) {
if (a < b)
return a;
else return b;
}
void Solve(int dp[][3], int a[][3]) {
for (int i = 1; i <= N; i++) {
dp[i][0] = _min(dp[i - 1][1], dp[i - 1][2]) + a[i][0];
dp[i][1] = _min(dp[i - 1][0], dp[i - 1][2]) + a[i][1];
dp[i][2] = _min(dp[i - 1][0], dp[i - 1][1]) + a[i][2];
}
}
int main() {
int a[1001][3] = { 0, };
int dp[1001][3] = { 0, };
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
}
Solve(dp, a);
printf("%d", _min(_min(dp[N][0],dp[N][1]),dp[N][2]));
return 0;
}