这神奇的代码能过哎,略显粗糙
查看原帖
这神奇的代码能过哎,略显粗糙
361035
graspppp楼主2022/7/10 21:49
#include<bits/stdc++.h>
using namespace std;
int n,dp[15][15],d[15][15],z[15][15],x[15][15];
int mmap[15][15],ans,ans1,ans2,ans3;
int main()
{
	cin>>n;
	int a,b,c;
	while(scanf("%d %d %d",&a,&b,&c))
	{
		if(a==0&&b==0&&c==0){
			break;
		}
		mmap[a][b]=c;
		d[a][b]=c;
		z[a][b]=c;
	}
	//第一步:两次dp找最大值 
	for(int i=n;i>=1;i--)
	{
		for(int j=n;j>=1;j--){
			dp[i][j]=max(dp[i+1][j],dp[i][j+1])+mmap[i][j];
			if(dp[i][j]>ans)
			{
				d[i][j]=0;
			}
			ans=max(ans,dp[i][j]);
			
			//cout<<ans<<" ";
		}
		//cout<<endl;
	}
	//cout<<endl<<endl;
	//
	//
	//
	//d[5][2]=0;
	//d[6][3]=0;
	memset(dp,0,sizeof(dp));
	for(int i=n;i>=1;i--)
	{
		for(int j=n;j>=1;j--){
			int now=dp[i][j];
			dp[i][j]=max(dp[i+1][j],dp[i][j+1])+d[i][j];
			ans1=dp[i][j];
			//cout<<ans1<<" ";
		}
		//cout<<endl;
	}
	//cout<<endl;
	//第二步:一次简单遍历 ,一次dp找最大值 
	int k=n;
	int sum=0;
	memset(dp,0,sizeof(dp));
	for(int i=n;i>=1;i--){
		for(int j=k;j>=1;j--){
			sum+=z[j][i];
			if(sum>ans2)
			{
				z[j][i]=0;
				k=j; 
			}
			ans2=sum;
			//cout<<ans2<<" ";
			 
		}
		//cout<<endl;
	}
	memset(dp,0,sizeof(dp));
	for(int i=n;i>=1;i--)
	{
		for(int j=n;j>=1;j--){
			int now=dp[i][j];
			dp[i][j]=max(dp[i+1][j],dp[i][j+1])+z[i][j];
			ans3=max(ans3,dp[i][j]);
		//	cout<<ans3<<" ";
		}
	//	cout<<endl; 
	}
	//二者比较得最大值 
	if(ans+ans1>ans2+ans3)	cout<<ans+ans1<<endl;
	else	cout<<ans2+ans3;
	return 0;
}

但我觉得这种写法不符合题意,但又举不出反例=-=

2022/7/10 21:49
加载中...