60分求调
查看原帖
60分求调
1143757
nizi15926楼主2023/10/16 20:09
#include<bits/stdc++.h>
using namespace std;
int a[102],sum[206]={0};
int dpmax[206][206],dpmin[206][206];
int x=0,y=0;
int main()
{
	memset(dpmax,0,sizeof(dpmax));
	memset(dpmin,0,sizeof(dpmin));
	int n,m;
	cin>>n;
  	sum[n]=0;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		a[i+n]=a[i];
	}
	for(int i=1;i<=n*2;i++)//initialize
	  sum[i]=sum[i-1]+a[i];
	  
	for(int len=2;len<=n;len++)//dp
	  {
	  	for(int i=1;i<=2*n-len+1;i++)//from i,2*n considers the circle 
	  	  {
			int j=i+len-1;//to j
			dpmin[i][j]=dpmin[i][i]+dpmin[i+1][j];
			dpmax[i][j]=dpmax[i][i]+dpmax[i+1][j];//通常会初始化一个无穷大,但是实质会在第一次循环被换掉,因此初始化为第一个情况,从第二次开始循环。 
			for(int k=i+1;k<j;k++)//divided by k
	  	        {
	  	  	      dpmax[i][j]=max(dpmax[i][j],dpmax[i][k]+dpmax[k+1][j]);
	  	  	      dpmin[i][j]=min(dpmin[i][j],dpmin[i][k]+dpmin[k+1][j]);
				}			
	
	  	  	dpmax[i][j]+=sum[j]-sum[i-1];
			dpmin[i][j]+=sum[j]-sum[i-1];
			
		  }//不论断点,加量相同,区别在于断点
	}
	
	//get ansewer
	int mmax=dpmax[1][n],mmin=dpmin[1][n];
	for(int i=2;i<=n;i++)
	  {
	  	mmax=max(mmax,dpmax[i][i+n-1]);
	  	mmin=min(mmin,dpmin[i][i+n-1]);
	  	cout<<" i="<<i<<",j="<<i+n-1<<"时 max="<<dpmax[i][i+n-1]; 
	  }
	 
    cout<<mmin<<endl<<mmax<<endl;  
    return 0;
}

2023/10/16 20:09
加载中...