16分求调
查看原帖
16分求调
1122180
封禁用户楼主2024/10/3 16:36

思路大概是用l数组存储当前路径,然后判断路径上的数字和是不是大于最大值,大于就替换;然后将第一条路径上的数字清零,再跑第二遍

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
};
int n,maxn=-1,ans=0;
int m[9][9];
vector<node> l;
vector<node> last;
void dfs(int x,int y,vector<node> &l,int cnt)
{
	node u;
	u.x=x,u.y=y;
	l.push_back(u);
	if(x>n || y>n) return;
	if(x==n && y==n){
		if(cnt>maxn){
			maxn=cnt;
			last.clear();
			last.resize(l.size());
			copy(l.begin(),l.end(),last.begin());
		}
	}
	dfs(x+1,y,l,cnt+m[x][y]);dfs(x,y+1,l,cnt+m[x][y]);
	l.pop_back();
	return;
}
int main()
{
	cin>>n;
	while(1)
	{
		int x,y,a;
		cin>>x>>y>>a;
		if(x==0 && y==0 && a==0) break;
		m[x][y]=a;
	}
	dfs(1,1,l,0);
	ans+=maxn;
	maxn=0;
	for(int i=0;i<last.size();i++)
	{
		m[last[i].x][last[i].y]=0;
	}
	dfs(1,1,l,0);
	cout<<ans+maxn;
	return 0;
}
2024/10/3 16:36
加载中...