1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <stdio.h> #include <algorithm> using namespace std; int maxArr[10000][10] = { 0 }; int dp[10000][10] = { 0 }; int main() { int n; scanf("%d", &n); int arr[10] = { 0 }; for (int i = 1; i <= n; i++) { for (int j = 1; j <= 6; j++) { scanf("%d", &arr[j]); } // 각 주사위 숫자 별 최대 옆면 수 // 여기서 j는 idx for (int j = 1; j <= 6; j++) { int maxN; if (j == 1 || j == 6) { maxN = 0; for (int k = 1; k <= 6; k++) { if (k != 1 && k != 6) { maxN = max(maxN, arr[k]); } } maxArr[i][j] = maxN; } if (j == 2 || j == 4) { maxN = 0; for (int k = 1; k <= 6; k++) { if (k != 2 && k != 4) { maxN = max(maxN, arr[k]); } } maxArr[i][j] = maxN; } if (j == 3 || j == 5) { maxN = 0; for (int k = 1; k <= 6; k++) { if (k != 3 && k != 5) { maxN = max(maxN, arr[k]); } } maxArr[i][j] = maxN; } } // dp 작성하기 dp[i][j] = max(dp[i-1][?]+maxArr[i][j]) // 여기서 j는 주사위 숫자 for (int j = 1; j <= 6; j++) { //dp[i][j]의 밑면에 있는 수 찾기 int sideIdx = 0,k; for (k = 1; k <= 6; k++) { if (arr[k] == j) { if (k == 1) sideIdx = 6; if (k == 2) sideIdx = 4; if (k == 3) sideIdx = 5; if (k == 4) sideIdx = 2; if (k == 5) sideIdx = 3; if (k == 6) sideIdx = 1; break; } } int sideNum = arr[sideIdx]; dp[i][j] = dp[i - 1][sideNum] + maxArr[i][k]; } } //출력 int maxRst = 0; for (int i = 1; i <= 6; i++) { maxRst = max(maxRst, dp[n][i]); } printf("%d", maxRst); } | cs |
'알고리즘 > DP' 카테고리의 다른 글
점수 인플레이션 더블릿 (0) | 2019.02.19 |
---|---|
정사각형 수 더블릿 (0) | 2019.02.18 |
완전순열 더블릿 (0) | 2019.02.18 |
bits -더블릿 (0) | 2019.02.16 |
구간 차의 합 최대 - 더블릿 (0) | 2019.02.16 |