参考:登录 - 洛谷
题目描述:
设有NxN方格图(N≤9),我们将其中的某些方格填入正整数,而其他的方格中则放入数字0。
某人从图的左上角A点出发,可以向下行走,也可以向右走,直到到达右下角的B点。
在走过的路上,它可以取走方格中的数 (取走后的方格将变为数字0)
此人从A点到B点共走两次,找出2条这样的路径,使得取得的数之和为最大
输入的第一行为一个整数N(表示NxN的方格)
接下来每行有3个整数,前两个表示位置,第三个为该位置上所放的数,一行的单独0表示输入结束
输出
只需输出一个整数,表示2条路径上取得的最大的和。
解题思路:
考虑是四维动态规划的模板题
和后面的传纸条类似
我们考虑两个人同时走,相当于数字三角形
具体代码如下:
#include<iostream>
//f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l]
//不过要判断i=k&&j=l的情况
using namespace std;
#include<algorithm>
//全局变量 四维数组边界12
int hezhi[12][12][12][12], gezi[12][12], n, x, y, z;//全局变量中值默认为0
int main()
{
//输入的第一行为一个整数 x y z 此时也要输入因为前值为0
cin >> n;
cin >> x >> y >> z;
//接下来的输入 每行有3个整数
//前两个表示位置,第三个数为该位置上所放的数
//一行 单独的0表示结束
//当 x y z都不为0时保持输入
while (x != 0 || y != 0 || z != 0)
{
gezi[x][y] = z;
cin >> 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++)
{
hezhi[i][j][k][l] = max(max(hezhi[i - 1][j][k - 1][l], hezhi[i][j - 1][k][l - 1]),
max(hezhi[i][j - 1][k - 1][l], hezhi[i - 1][j][k][l - 1])) + gezi[i][j] + gezi[k][l];
if (i == k && j == l)hezhi[i][j][k][l] -= gezi[i][j];
}
}
}
}
cout<< hezhi[n][n][n][n];
return 0;
}
结果如下