90pts求助 两个点WA 无TLE
查看原帖
90pts求助 两个点WA 无TLE
373288
cxy000楼主2022/9/24 21:35
#include <bits/stdc++.h>
using namespace std;
long long a[1010][1010];
long long ans=0,ans2=0,old=0;
int n;
struct node {
	int x,y;
}lu[1000100];
bool vis[1010][1010];
bool ook[1010][1010];
node old_lu[1001000];
int way_x[4]={-1,-1,1,1};//左上右上左下右下 
int way_y[4]={-1,1,-1,1};
int cmp(int x,int y){
	return x>y;
}
void dfs(int way,int x,int y,int sum,int pp){
	//cout<<x<<" "<<y<<" "<<sum<<" "<<way_x[way]<<" "<<way_y[way]<<" "<<endl;
	if(vis[x][y]) {
		int oo=sum;
		for(int i=1;i<=pp-1;i++){
			if(ook[lu[i].x][lu[i].y]) sum-=a[lu[i].x][lu[i].y];
		}
	//cout<<sum<<endl;
		if(oo>ans){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					ook[i][j]=vis[i][j];
				}
			}
//				cout<<sum<<endl;
//		for(int i=1;i<=n;i++){
//				for(int j=1;j<=n;j++){
//					cout<<ook[i][j]<<" ";
//				}
//				cout<<endl;
//			}
//			cout<<old<<" "<<pp<<endl;
//			for(int i=1;i<=old;i++){
//				cout<<old_lu[i].x<<" "<<old_lu[i].y<<endl;
//			}
			int ni_cha=0;
			for(int i=1;i<=old;i++){
				if(ook[old_lu[i].x][old_lu[i].y]){
					ni_cha-=a[old_lu[i].x][old_lu[i].y];
				}
			}
			//cout<<ni_cha<<endl;
			ans2=ans+ni_cha;
			ans=oo;
			old=pp-1;
			for(int i=1;i<=old;i++) old_lu[i].x=lu[i].x,old_lu[i].y=lu[i].y;
		}
		else if(sum>ans2){
			ans2=sum;
		}
		return;
	}
	int bb=1;
	while(x+way_x[way]<=n && y+way_y[way]<=n && x+way_x[way]>0 && y+way_y[way]>0){
		vis[x][y]=1;
		if(bb!=1) pp++;
		lu[pp].x=x;
		lu[pp].y=y;
		x+=way_x[way];
		y+=way_y[way];
		if(!vis[x][y]) {
			sum+=a[x][y];
		}
		else break;
		bb++;
	}
	if(way==3) dfs(1,x,y,sum,pp+1);
	if(way==1) dfs(0,x,y,sum,pp+1);
	if(way==0) dfs(2,x,y,sum,pp+1);
	if(way==2) dfs(3,x,y,sum,pp+1);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	if(n<=3){
		if(n==1) cout<<a[1][1];
		else if(n==2) cout<<a[1][1]+a[1][2]+a[2][1]+a[2][2];
		else {
			int kk[4]={0};
			int xx,yy,zz;
			kk[1]=a[1][1]+a[2][2]+a[3][3];
			xx=kk[1];
			kk[2]=a[1][3]+a[2][2]+a[3][1];
			yy=kk[2];
			kk[3]=a[1][2]+a[2][1]+a[2][3]+a[3][2];
			sort(kk+1,kk+4,cmp);
			if((kk[1]==xx && kk[2]==yy) || (kk[1]==yy && kk[2]==xx)){
				if(kk[1]+kk[2]-a[2][2]>kk[1]+kk[3]) cout<<kk[1]+kk[2]-a[2][2];
				else cout<<kk[1]+kk[3];
			}
			else cout<<kk[1]+kk[2];
		}
		return 0;
	}
	for(int i=1;i<=n-1;i++){
		dfs(3,i,1,a[i][1],1);
		memset(vis,0,sizeof vis);
		memset(lu,0,sizeof lu);
	}
	dfs(1,n,1,a[n][1],1);
	cout<<ans+ans2;
	return 0;
}

大佬们帮忙看一下 点15和18WA

2022/9/24 21:35
加载中...