牛客假日团队赛10——A 方格取数(dp)

链接: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)遍历整个地图,每个人只能从上面或者左面走到下一个位置,当两个人走重复的点时,减去多加的那个点的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值