#12259. 珅泽教育CSP-J第一轮模拟考第二十四套 第 31 题

珅泽教育CSP-J第一轮模拟考第二十四套 第 31 题

二、阅读程序(判断题正确填 A、错误填 B;除特殊说明外,判断题 2 分,选择题 3 分,共计 40 分)

程序三:立方体滚动动态规划

#include <iostream>
using namespace std;

const int INF = 1000000000;
#define Front 0
#define Back 1
#define Left 2
#define Right 3
#define Up 4
#define Down 5
int w[6], a[1003][1003];
const int way1[] = {Up, Right, Down, Left};
const int way2[] = {Up, Front, Down, Back};
const int way3[] = {Left, Front, Right, Back};

int get_max(int &a, int b) {
    return a = max(a, b);
}

int right_rotate(int &u) {
    for (int i = 0; i < 4; ++i)
        if (u == way1[i])
            return u = way1[(i + 1) % 4];
    return u;
}

int front_rotate(int &u) {
    for (int i = 0; i < 4; ++i)
        if (u == way2[i])
            return u = way2[(i + 1) % 4];
    return u;
}

const int anchorX = Up;
const int anchorY = Front;
const int anchorZ = Right;

int find_down(int u, int v) {
    if (u == Down || u == Up) return anchorX ^ (u == Up);
    if (v == Down || v == Up) return anchorY ^ (v == Up);
    for (int i = 0; i < 4; ++i)
        if (u == way3[i])
            return anchorZ ^ (v == way3[(i + 1) % 4]);
    return -1;
}

int n, m, dp[1003][1003][6][6];

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            cin >> a[i][j];
    for (int i = 0; i < 6; ++i)
        cin >> w[i];
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            for (int a = 0; a < 6; ++a)
                for (int b = 0; b < 6; ++b)
                    dp[i][j][a][b] = -INF;
    dp[0][0][anchorX][anchorY] = a[0][0] * w[Down];
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            for (int p = 0; p < 6; ++p)
                for (int q = 0; q < 6; ++q)
                    if (dp[i][j][p][q] != -INF) {
                        int x = dp[i][j][p][q];
                        int u1 = p, v1 = q;
                        right_rotate(u1);
                        right_rotate(v1);
                        get_max(dp[i][j + 1][u1][v1],
                                x + w[find_down(u1, v1)] * a[i][j + 1]);
                        int u2 = p, v2 = q;
                        front_rotate(u2);
                        front_rotate(v2);
                        get_max(dp[i + 1][j][u2][v2],
                                x + w[find_down(u2, v2)] * a[i + 1][j]);
                    }
    int ans = -INF;
    for (int p = 0; p < 6; ++p)
        for (int q = 0; q < 6; ++q)
            ans = max(ans, dp[n - 1][m - 1][p][q]);
    printf("%d\n", ans);
    return 0;
}

输入数据的绝对值均不超过 10310^3

  1. anchorX、anchorY、anchorZ 依次更换为哪组值时,对全部合法数据的输出不变?

{{ select(1) }}

  • Left、Front、Down
  • Left、Up、Front
  • Left、Down、Back
  • Down、Right、Front