2023.10.1记录

被NOIP提高组的题暴虐。

[NOIP2000 提高组] 方格取数

NOIP2000 提高组] 方格取数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意

从一个\(n\times n\)的矩阵的左上角走到右下角,只能往右边和下边走,选择两条路,把这两条路经过的单位的数字取走,每个单位的数字只能取一次,求最大能取走的数字的总和。

思路

可以用棋盘型dp,转态转移方程见代码。

代码

#include<bits/stdc++.h>

using namespace std;
using i64 = long long;

int dp[10][10][10][10], mat[10][10];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    int x, y, z;
    while(cin >> x >> y >> z && x) {
        mat[x][y] = z;
    }

    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            for(int k = 1; k <= n; k++) {
                for(int l = 1; l <= n; l++) {
                    int x = max(dp[i - 1][j][k - 1][l], dp[i - 1][j][k][l - 1]);
                    int y = max(dp[i][j - 1][k - 1][l], dp[i][j - 1][k][l - 1]);
                    dp[i][j][k][l] = max(x, y) + mat[i][j];
                    if(i != k && j != l) {
                        dp[i][j][k][l] += mat[k][l];
                    }
                }
            }
        }
    }

    cout << dp[n][n][n][n] << "\n";

    return 0;
}
posted @ 2023-10-02 15:22  wuyoudexian  阅读(16)  评论(0)    收藏  举报