链接:https://ac.nowcoder.com/acm/contest/1072/A
来源:牛客网
题目描述
设有N*N的方格图(N ≤ 10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):
某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。
此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。
输入描述:
输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。
输出描述:
只需输出一个整数,表示2条路径上取得的最大的和。
示例1
输入:
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
输出:
67
题意思路:中文的,不多说了,dp。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int map[15][15][15][15];
int sum[15][15];
int main()
{
int n;
cin >> n;
int a, b, c;
while(cin>>a>>b>>c)
{
if (a == 0 && b == 0 && c == 0)
break;
sum[a][b] = c;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
for (int x = 1; x <= n; x++)
{
for (int y = 1; y <= n; y++)
{
map[i][j][x][y] = max(map[i][j][x][y], map[i][j - 1][x][y - 1]);//第一个人和第二个人在当前位置同时和他们的左 //面比较
map[i][j][x][y] = max(map[i][j][x][y], map[i-1][j][x][y - 1]);//第一个人与上面比较,第二个人和左面比较
map[i][j][x][y] = max(map[i][j][x][y], map[i][j - 1][x-1][y]);
map[i][j][x][y] = max(map[i][j][x][y], map[i-1][j][x-1][y]);
map[i][j][x][y] += sum[i][j] + sum[x][y];
if (i == x && y == j)
{
map[i][j][x][y] -= sum[i][j];
}
}
}
}
}
cout << map[n][n][n][n] << endl;
}
感悟:看成两个人走两条路,第一个人在(i=1,j=1)位置时,(i=1,j=2)…,(x,y)遍历整个地图,每个人只能从上面或者左面走到下一个位置,当两个人走重复的点时,减去多加的那个点的值。