21 条题解

  • 0
    @ 2026-7-4 16:48:53

    #include #include #include #include #include using namespace std;

    typedef long long ll; const int MAXN = 55; const int MAXK = 3; const ll INF = -1e18;

    int n; int g[MAXN][MAXN]; vector vals;

    ll dp[MAXN][MAXN][MAXK + 1];

    vector calc_max(int limit_val, bool is_A) { int max_t = is_A ? MAXK : n * n; for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) for (int k = 0; k <= MAXK; ++k) dp[i][j][k] = INF;

    int st = g[0][0];
    if (st != 0) {
        if ((is_A && st > limit_val) || (!is_A && st < limit_val)) {
            dp[0][0][1] = st;
        }
    }
    dp[0][0][0] = 0;
    
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (i == 0 && j == 0) continue;
            int cur = g[i][j];
            bool ok = false;
            if (cur != 0) {
                if ((is_A && cur > limit_val) || (!is_A && cur < limit_val))
                    ok = true;
            }
            if (i > 0) {
                for (int k = 0; k <= MAXK; ++k) {
                    if (dp[i-1][j][k] == INF) continue;
                    if (dp[i][j][k] < dp[i-1][j][k])
                        dp[i][j][k] = dp[i-1][j][k];
                    if (ok && k + 1 <= MAXK) {
                        if (dp[i][j][k+1] < dp[i-1][j][k] + cur)
                            dp[i][j][k+1] = dp[i-1][j][k] + cur;
                    }
                }
            }
            if (j > 0) {
                for (int k = 0; k <= MAXK; ++k) {
                    if (dp[i][j-1][k] == INF) continue;
                    if (dp[i][j][k] < dp[i][j-1][k])
                        dp[i][j][k] = dp[i][j-1][k];
                    if (ok && k + 1 <= MAXK) {
                        if (dp[i][j][k+1] < dp[i][j-1][k] + cur)
                            dp[i][j][k] + cur;
                        dp[i][j][k+1] = max(dp[i][j][k+1], dp[i][j-1][k] + cur);
                    }
                }
            }
        }
    }
    vector<ll> res(MAXK + 1, INF);
    for (int k = 0; k <= MAXK; ++k)
        res[k] = dp[n-1][n-1][k];
    return res;
    

    }

    int main() { freopen("StarPick.in","w",stdin); freopen("StarPick.out","r",stdout); ios::sync_with_stdio(false); cin.tie(0); cin >> n; set s; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cin >> g[i][j]; if (g[i][j] != 0) s.insert(g[i][j]); } } for (int x : s) vals.push_back(x); ll ans = 0; for (int mid : vals) { auto a = calc_max(mid, true);
    auto b = calc_max(mid, false); for (int ka = 1; ka <= 3; ++ka) { if (a[ka] == INF) continue; for (int kb = 0; kb <= ka; ++kb) { if (b[kb] == INF) continue; ans = max(ans, a[ka] + b[kb]); } } } cout << ans << endl; return 0; }

    信息

    ID
    2
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    3736
    已通过
    602
    上传者