网站域名需要备案吗/网页制作代码
题目地址:
https://www.acwing.com/problem/content/277/
给定一个m×nm\times nm×n的二维非负整数矩阵,从左上角走到右下角(每次只能向下或者向右走),再从右下角返回左上角(每次只能向左或者向上走),沿途需取掉路径上的数字,但是每个数字只能取一次(第二次走到某个之前走过的格子的时候,相当于这个格子的数是000)。问两次路径和的最大值。
输入格式:
第一行有222个用空格隔开的整数mmm和nnn,表示学生矩阵有mmm行nnn列。接下来的mmm行是一个m×nm\times nm×n的矩阵,每行的nnn个整数之间用空格隔开。
输出格式:
输出一个整数,表示路径和的最大值。
数据范围:
1≤n,m≤501\le n,m\le 501≤n,m≤50
参考https://blog.csdn.net/qq_46105170/article/details/113706615。代码如下:
#include <iostream>
using namespace std;const int N = 60;
int m, n;
int a[N][N], f[2 * N + 1][N + 1][N + 1];int main() {cin >> m >> n;for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)cin >> a[i][j];for (int k = 2; k <= 2 * N; k++)for (int i1 = 1; i1 <= m; i1++)for (int i2 = 1; i2 <= m; i2++) {int j1 = k - i1, j2 = k - i2;if (1 <= j1 && j1 <= n && 1 <= j2 && j2 <= n) {int t = i1 == i2 ? a[i1][j1] : a[i1][j1] + a[i2][j2];int &x = f[k][i1][i2];x = max(x, f[k - 1][i1 - 1][i2 - 1] + t);x = max(x, f[k - 1][i1 - 1][i2] + t);x = max(x, f[k - 1][i1][i2 - 1] + t);x = max(x, f[k - 1][i1][i2] + t);}}cout << f[m + n][m][m] << endl;return 0;
}
时间复杂度O((m+n)m2)O((m+n)m^2)O((m+n)m2),空间O(mn)O(mn)O(mn)。