求助,2,3,4 WA
查看原帖
求助,2,3,4 WA
602282
huangguoguo楼主2022/3/11 10:37

好像是求最大值的时候出了些问题,但是感觉和求最小值原理一样,没发现问题

#include <bits/stdc++.h>
using namespace std;
const int MAX=305;
int a[MAX*2];
int sum[MAX][MAX];
int dp[MAX][MAX];//求最小
int dpp[MAX][MAX];//求最大 
int n;

void init() {
	cin>>n;
	for (int i=1;i<=n;i++) {
		cin>>a[i]; 
		sum[i][i]=a[i];
		a[i+n]=a[i];
		sum[i+n][i+n]=sum[i][i]; 
	}
	n*=2;
	for (int i=1;i<=n;i++)
		for (int j=i;j<=n;j++)  
			sum[i][j]=sum[i][j-1]+a[j];
}

int main() {
	init();
	memset(dp,0x3f,sizeof(dp));
	for (int i=1;i<=n;i++) 
		dp[i][i]=0;	
	for (int len=2;len<=n/2;len++) 
		for (int l=1;l<=n-len+1;l++) { 
			int r=l+len-1;
			for (int p=l;p<r;p++) {
				dp[l][r]=min(dp[l][r],sum[l][p]+sum[p+1][r]+dp[l][p]+dp[p+1][r]);
				dpp[l][r]=max(dp[l][r],sum[l][p]+sum[p+1][r]+dpp[l][p]+dpp[p+1][r]);	
			}	
		}
	int ansMin=0x3f3f3f3f,ansMax=0;
	n/=2;
	for (int i=1;i<=n;i++) {
		ansMin=min(ansMin,dp[i][i+n-1]);
		ansMax=max(ansMax,dpp[i][i+n-1]);
	}
	cout<<ansMin<<endl<<ansMax<<endl;
	cout<<dp[1][n]<<" "<<dp[n+1][n+n];
	return 0;
} 
2022/3/11 10:37
加载中...