四边形不等式20pts求调,样例过了
查看原帖
四边形不等式20pts求调,样例过了
1284088
meifan666楼主2024/9/8 14:10
#include <bits/stdc++.h>
using namespace std;
int n,a[210];
int sum[210];
int minn=INT_MAX,maxn;
int dp1[210][210],dp2[210][210],cut1[210][210],cut2[210][210];//四边形不等式
signed main() {
	cin>>n;
	memset(dp1,0x3f,sizeof(dp1));
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
		dp1[i][i]=0;
		cut1[i][i]=i;cut2[i][i]=i;
	}
	for(int i=n+1;i<=n+n;i++){
		a[i]=a[i-n];
		sum[i]=sum[i-1]+a[i];
		dp1[i][i]=0;
		cut1[i][i]=i;cut2[i][i]=i;
	}
	n*=2;
	for(int len=2;len<=n;len++){
		for(int i=1;i<=n;i++){
			int j=i+len-1;
			for(int k=cut1[i][j-1];k<=cut1[i+1][j];k++){
				if(dp1[i][j]>dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]){
					dp1[i][j]=dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1];
					cut1[i][j]=k;
				}
			}
		}
	}
	for(int len=2;len<=n;len++){
		for(int i=1;i<=n;i++){
			int j=i+len-1;
			for(int k=cut2[i][j-1];k<cut2[i+1][j];k++){
				if(dp2[i][j]<dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]){
					dp2[i][j]=dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1];
					cut2[i][j]=k;
				}
			}
		}
	}
	n/=2;
	for(int i=1;i<=n+1;i++){
		minn=min(minn,dp1[i][i+n-1]);
		maxn=max(maxn,dp2[i][i+n-1]);
	}
	cout<<minn<<'\n'<<maxn;
	return 0;
}
2024/9/8 14:10
加载中...