40分,求调
查看原帖
40分,求调
751546
wenyutao1楼主2023/8/26 21:03

我感觉写的没问题,区间DP

#include<bits/stdc++.h>
using namespace std;
const int N=202,INF=0x7f7f7f7f;
int n,a[N],sum[N],dp1[N][N],dp2[N][N],minn=INF,maxn=-INF;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		for(int j=i+1;j<=n<<1;++j) dp1[i][j]=dp1[i+n][j]=INF,dp2[i][j]=dp2[i+n][j]=-INF;
		a[n+i]=a[i];dp1[i][i]=dp1[n+i][n+i]=dp2[i][i]=dp2[n+i][n+i]=a[i];
	}
	for(int i=1;i<=n<<1;++i) sum[i]=sum[i-1]+a[i];
	for(int i=1;i<n;++i){
		for(int j=1;j<=n;++j){   //枚举是起点 
			int sumz=sum[i+j]-sum[j-1];
			for(int k=0;k<i;++k){
				int sum1=sum[j+k]-sum[j-1];
				int sum2=sum[j+i]-sum[j+k];
				if(k&&k!=i-1){
					dp1[j][i+j]=min(dp1[j][i+j],sumz+dp1[j][j+k]+dp1[j+k+1][i+j]);
					dp2[j][i+j]=max(dp2[j][i+j],sumz+dp2[j][j+k]+dp2[j+k+1][i+j]);
				}
				if(k&&k==i-1){
					dp1[j][i+j]=min(dp1[j][i+j],sum1+dp1[j][j+k]+dp1[j+k+1][i+j]);
					dp2[j][i+j]=max(dp2[j][i+j],sum1+dp2[j][j+k]+dp2[j+k+1][i+j]);
				}
				if(!k&&k!=i-1){
					dp1[j][i+j]=min(dp1[j][i+j],sum2+dp1[j][j+k]+dp1[j+k+1][i+j]);
					dp2[j][i+j]=max(dp2[j][i+j],sum2+dp2[j][j+k]+dp2[j+k+1][i+j]);
				}
				if(!k&&k==i-1){
					dp1[j][i+j]=min(dp1[j][i+j],dp1[j][j+k]+dp1[j+k+1][i+j]);
					dp2[j][i+j]=max(dp2[j][i+j],dp2[j][j+k]+dp2[j+k+1][i+j]);
				}
			}
		}
	}
	for(int i=1;i<=n;++i) minn=min(minn,dp1[i][i+n-1]),maxn=max(maxn,dp2[i][i+n-1]);
	printf("%d\n%d",minn,maxn); 
	return 0;
}

求大神调试,写的太丑

2023/8/26 21:03
加载中...