是思路有问题吗?为什么第三个点过不了,蒻稽求助!!!
查看原帖
是思路有问题吗?为什么第三个点过不了,蒻稽求助!!!
698678
zlinda楼主2022/10/1 21:15
/*主要思路是两次dp,在第一次dp后将最优路径上的点删去(赋零),
做第二次dp,两次结果相加得到最大值 */
#include<bits/stdc++.h>
using namespace std;
int a[15][15],b[15][15],dp[15][15];
int main()
{
	int n,x,y,z,t,i,j;
	long long ans;
	cin>>n;
	do{
		cin>>x>>y>>z;
		a[x][y]=z;
	}while(x!=0&&y!=0&&z!=0);
	for(i=1;i<=n;i++) 
	{
		for(j=1;j<=n;j++) 
		{
			dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];//转移 
			if(dp[i-1][j]>=dp[i][j-1]) b[i][j]=(i-1)*100+j;
			else b[i][j]=i*100+j-1;//记录当前节点是从哪个点转移过来的 
		}
	}
	ans=dp[n][n]; x=n; y=n;
	while(x!=0&&y!=0)//把第一次最优路径上的值全赋值为零 
	{
		a[x][y]=0;
		t=b[x][y]/100;
		y=b[x][y]%100;
		x=t;
	}
	if(x==0) for(i=1;i<=y;i++) a[1][i]=0;
	else for(i=1;i<=x;i++) a[i][1]=0;//边界处理
	for(i=1;i<=n;i++) for(j=1;j<=n;j++) dp[i][j]=0;//初始化
	for(i=1;i<=n;i++) for(j=1;j<=n;j++) dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j];//转移
	ans+=dp[n][n];//加上第二次最优路径值
	cout<<ans<<"\n";
	return 0;
}
2022/10/1 21:15
加载中...