1 solutions

  • 0
    @ 2025-3-3 16:24:11

    C :

    #include "stdio.h"
    int n,a[2000],s[4001];
    int max;
    int m[2000][2001];
    int Max(int a,int b)
    {
    	if(a>b)
    		return a;
    	return b;
    }
    int main()
    {
    	int i,j;
    	scanf("%d",&n);
    	for(i=0;i<n;i++)
    	{
    		scanf("%d",&a[i]);
    		s[i+1]=s[i]+a[i];
    	}
    	for(i=n;i<2*n;i++)
    		s[i+1]=s[i]+a[i%n];
    	for(j=1;j<n;j++)
    	{
    		for(i=0;i<n;i++)
    			m[i][j]=Max(m[(i+1)%n][j-1],m[i][j-1])+s[i+j+1]-s[i];
    	}
    	max=m[0][n-1];
    	for(i=0;i<n;i++)
    	{
    		if(max<m[i][n-1])
    			max=m[i][n-1];
    	}
    	printf("%d\n",max);
    	return 0;
    }
    
    

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    long long n,a[4001],sum[4001]={0},f_max[4001][4001]={0};
    void init();
    void work();
    int my_min(int,int);
    int my_max(int,int);
    int main()
    {
    	//freopen("stone5.in","r",stdin);
    	//freopen("stone5.out","w",stdout);
    	init();
    	work();
    	return 0;	
    }
    void init()
    {
    	cin>>n;	
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		a[i+n]=a[i];
    	}
    	for(int i=1;i<=2*n;i++) sum[i]=sum[i-1]+a[i];
    }
    void work()
    {
    	for(int d=2;d<=n;d++)
    	{
    		for(int i=1;i<=2*n-d+1;i++)
    		{
    			int j=i+d-1;
    			//f_min[i][j]=0x7fffffff/2;
    			/*for(int k=i;k<j;k++)
    			{
    				f_max[i][j]=my_max(f_max[i][j],f_max[i][k]+f_max[k+1][j]);
    				f_min[i][j]=my_min(f_min[i][j],f_min[i][k]+f_min[k+1][j]);
    				
    			}*/
    			f_max[i][j]=my_max(f_max[i+1][j],f_max[i][j-1])+sum[j]-sum[i-1];
    			//f_min[i][j]=my_min(f_min[i+1][j],f_min[i][j-1])+sum[j]-sum[i-1];
    			//cout<<d<<' '<<sum[j]-sum[i-1]<<' '<<i<<' '<<j<<' '<<f_min[i][j]<<endl;			
    		}
    	}
    	long long tot2=0;
    	//for(int i=1;i<=n;i++) tot1=my_min(tot1,f_min[i][i+n-1]);
    	for(int i=1;i<=n;i++) tot2=my_max(tot2,f_max[i][i+n-1]);
    	cout<<tot2<<endl;
    }
    int my_min(int x,int y)
    {
    	if(x<y)return x;
    	else return y;
    }
    int my_max(int x,int y)
    {
    	if(x>y)return x;
    	else return y;
    }
    
    • 1

    Information

    ID
    10059
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By