C++ 方格取数 动态规划

5 篇文章 0 订阅
4 篇文章 0 订阅

参考:登录 - 洛谷

题目描述:

设有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;
}

 

结果如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值