WA求调
查看原帖
WA求调
1041588
q188楼主2025/7/27 10:48
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
ll a[1005][1005]; 
ll ans=0;
ll anss[1005];
ll f[1005][1005];//i层j数
ll c[1005][1005]; 
ll b[1005][1005];
int main(){
	cin>>n;
	ll cnt=0;
	memset(f,0x7f,sizeof f);
	for(int i=1;i<=n;i++){
		ans=0;
		for(int j=1;j<=i;j++){
			cin>>a[i][j];
			ans=max(ans,a[i][j]);
		}
		cnt+=ans;
		anss[i]=ans;
	}
	f[1][1]=0;
	ll ans2=1e18;
	for(int i=1;i<n;i++){
		for(int j=1;j<=i;j++){
			if(a[i+1][j+1]==anss[i+1]){
				f[i+1][j+1]=min(f[i+1][j+1],f[i][j]);
			}else{
				f[i+1][j+1]=min(f[i+1][j+1],f[i][j]+1);
			}
			if(a[i+1][j]==anss[i+1]){
				f[i+1][j]=min(f[i+1][j],f[i][j]);
			}else{
				f[i+1][j]=min(f[i+1][j],f[i][j]+1);
			} 
		}
	}
	for(int i=1;i<=n;i++){
		ans2=min(ans2,f[n][i]);
		anss[i]=0;
	}
	//1
	cout<<cnt<<" "<<ans2<<endl;
	int cnth=0,cntw=0;
	for(int j=n;j>=1;j--){
		cnth++;
		for(int i=n;i>=j;i--){
			cntw++;
			c[cnth][cntw]=a[i][j];
		}cntw=0;
	}
	memset(f,0x7f,sizeof f); 
	cnth=0;
	ll cnnt=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			anss[i]=max(anss[i],c[i][j]);
		}cnnt+=anss[i];
	}
	f[1][1]=0;
	for(int i=1;i<n;i++){
		for(int j=1;j<=i;j++){
			if(c[i+1][j+1]==anss[i+1]){
				f[i+1][j+1]=min(f[i+1][j+1],f[i][j]);
			}else{
				f[i+1][j+1]=min(f[i+1][j+1],f[i][j]+1);
			}
			if(c[i+1][j]==anss[i+1]){
				f[i+1][j]=min(f[i+1][j],f[i][j]);
			}else{
				f[i+1][j]=min(f[i+1][j],f[i][j]+1);
			} 
		}
	}
	ll ans34=1e18;
	for(int i=1;i<=n;i++){
		ans34=min(ans34,f[n][i]+n);
	}
	if(cnnt>cnt){
		ans2=ans34;
		cnt=cnnt;
	}else{
		ans2=min(ans2,ans34);
	}
	cout<<cnt<<" "<<ans2<<endl;
	//2
	memset(anss,0,sizeof anss);
	cnth=0,cntw=0;
	for(int j=n;j>=1;j--){
		cnth++;
		for(int i=n;i>=j;i--){
			cntw++;
			b[cnth][cntw]=c[i][j];
		}cntw=0;
	} 
	cnth=0;
	cnnt=0;
	memset(f,0x7f,sizeof f);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			anss[i]=max(anss[i],b[i][j]);
		}
		cnnt+=anss[i];
	}
	cnt=max(cnt,cnnt);
	f[1][1]=0;
	for(int i=1;i<n;i++){
		for(int j=1;j<=i;j++){
			if(b[i+1][j+1]==anss[i+1]){
				f[i+1][j+1]=min(f[i+1][j+1],f[i][j]);
			}else{
				f[i+1][j+1]=min(f[i+1][j+1],f[i][j]+1);
			}
			if(b[i+1][j]==anss[i+1]){
				f[i+1][j]=min(f[i+1][j],f[i][j]);
			}else{
				f[i+1][j]=min(f[i+1][j],f[i][j]+1);
			} 
		}
	}
	ll ans43=1e18;
	for(int i=1;i<=n;i++){
		ans43=min(ans43,f[n][i]+n*2);
	}
	if(cnnt>cnt){
		ans2=ans43;
		cnt=cnnt;
	}else{
		ans2=min(ans2,ans43);
	}
	cout<<cnt<<" "<<ans2;
	return 0;
} 
2025/7/27 10:48
加载中...