洛谷1004——方格取数

在这里插入图片描述
在这里插入图片描述
思路:
由于需要取2条路径最大值之和,且取完该位置数为0,因此两条路径相互影响,需要将两次路径看作两个人同时取数,使用四维dp数组,f[i][j][k][l]表示第一个人走到(i,j),第二个人走到(k,l)时最大取数之和 。

代码:

#include <bits/stdc++.h>
using namespace std;
//f[i][j][k][l]表示第一个人走到(i,j),第二个人走到(k,l)时最大取数之和 
int main()
{
	int n,i,j,k,l,x,y,m;
	int a[10][10]={0},f[10][10][10][10]={0}; //初始化置0 
	cin>>n;
	while(scanf("%d%d%d",&x,&y,&m))
	{
		if(x==0&&y==0&&m==0) //输入3个0则停止输入 
			break;
		a[x][y]=m; //标记方格数字 
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			for(k=1;k<=n;k++)
			{
				l=i+j-k; //两人同时走
				if(l>=1)
				{
				//四种情况:都向右走,一个向下一个向右,一个向右一个向下,都向下走,选择取数最大情况  
				f[i][j][k][l]=max(f[i-1][j][k-1][l],max(f[i][j-1][k-1][l],max(f[i-1][j][k][l-1],f[i][j-1][k][l-1])));
				if(i==k&&j==l) //方格处数已第一个人被取过,则第二个人经过该处时数置0 
					f[i][j][k][l]+=a[i][j];
				else                                                           
					f[i][j][k][l]+=a[i][j]+a[k][l];
				}
			}
	cout<<f[n][n][n][n]; //遍历结束后取得最大数 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值