밑면과 윗면의 숫자를 계속 이어서 만들수 있는 기둥은 총 6개로
각 사이드를 잘 조합하여 최대값을 찾으면 되는 문제이다. 크게 어렵지 않다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// 주사위 쌓기
vector<int> opposite = {5, 3, 4, 1, 2, 0};
int getMaxSide(int d, int u) {// 위, 아래면 제외 가장 큰 수 반환
for (int i=6; i>0; i--) {
if (i != d && i != u) return i;
}
return 0;
}
int main() {
int n;
cin >> n;
vector<vector<int>> dices(n, vector<int>(6)), dp(n, vector<int>(6, 0));
for (int i=0; i<n; i++) {
for (int j=0; j<6; j++) {
cin >> dices[i][j];
}
}
for (int i=0; i<6; i++) {// 맨처음 주사위
dp[0][i] = getMaxSide(dices[0][i], dices[0][opposite[i]]);
}
for (int j=0; j<6; j++) {// 이후 주사위
int down = j;
for (int i=1; i<n; i++) {
down = find(dices[i].begin(), dices[i].end(), dices[i-1][opposite[down]]) - dices[i].begin();
dp[i][j] = dp[i-1][j] + getMaxSide(dices[i][down], dices[i][opposite[down]]);
}
}
cout << *max_element(dp[n-1].begin(), dp[n-1].end());
}