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;
}

                
            
        
浙公网安备 33010602011771号