一种复杂度巨大的方法求调
查看原帖
一种复杂度巨大的方法求调
520056
luoyx楼主2023/8/1 08:15

思路就是枚举两个三角形的顶点。


#include <bits/stdc++.h>
using namespace std;
int n,m;
int x,y;
const int N=205;
int a[N][N],b[N][N];
int ans;
int dp[N][N];

void calc(){
	for(int j=1;j<=2*n-1;j+=2){
		dp[n][j]=1;
	}
	for(int i=n-1;i>=1;i--){
		for(int j=1;j<=i*2-1;j+=2){
			dp[i][j]=1-a[i][j];
			if(dp[i][j]&&a[i+1][j]+a[i+1][j+1]+a[i+1][j+2]==0){
				dp[i][j]=min(dp[i+1][j],dp[i+1][j+2])+1;
			}
		}
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		a[x][y]=1;
	}
	calc();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=2*i-1;j++){
			for(int a=i;a<=n;a++){
				for(int b=(a==i?j:1);b<=2*a-1;b++){
					if(i==a&&j==b) continue;
					int &p=dp[i][j],&q=dp[a][b];
					if(i==a){
						int mx=b-j;
						mx/=2;
						if(max(p,q)>mx){
							ans=max(ans,max(p,q)*max(p,q)+min(mx,min(p,q))*min(mx,min(p,q)) );
						}
						else ans=max(ans,p*p+q*q);
					}
					else{
						int mx=max(i,a)-min(i,a);
						ans=max(ans,min(mx,p)*min(mx,p)+q*q);
					}
				}
			}
		}
	}
	cout<<ans<<endl;
}
2023/8/1 08:15
加载中...