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号