1 条题解

  • 0
    @ 2023-3-13 12:14:20

    C :

    #include "stdio.h"
    int n,a[100],s[101];
    int max[100][100],min[100][100];
    int main()
    {
    	int i,j,k;
    	scanf("%d",&n);
    	s[0]=0;
    	for(i=0;i<n;i++)
    	{
    		scanf("%d",&a[i]);
    		s[i+1]=s[i]+a[i];
    	}
    	for(i=1;i<n;i++)
    	{
    		for(j=i-1;j>=0;j--)
    		{
    			max[j][i]=max[j][j]+max[j+1][i]+s[i+1]-s[j];
    			min[j][i]=min[j][j]+min[j+1][i]+s[i+1]-s[j];
    			for(k=j+1;k<i;k++)
    			{
    				if(max[j][k]+max[k+1][i]+s[i+1]-s[j]>max[j][i])
    					max[j][i]=max[j][k]+max[k+1][i]+s[i+1]-s[j];
    				if(min[j][k]+min[k+1][i]+s[i+1]-s[j]<min[j][i])
    					min[j][i]=min[j][k]+min[k+1][i]+s[i+1]-s[j];
    			}
    		}
    	}
    	printf("%d\n%d\n",min[0][n-1],max[0][n-1]);
    	return 0;
    }
    

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    int n,a[301],sum[301][301]={0},f_min[301][301]={0},f_max[301][301]={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];
    	for(int i=1;i<n;i++)
    	{
    		int tot=a[i];
    		for(int j=i+1;j<=n;j++)
    		{
    			tot+=a[j];
    			sum[i][j]=tot;
    		}
    	}
    }
    void work()
    {
    	for(int d=2;d<=n;d++)
    	{
    		for(int i=1;i<=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]+=sum[i][j];
    			f_min[i][j]+=sum[i][j];			
    		}
    	}
    	cout<<f_min[1][n]<<endl;
    	cout<<f_max[1][n]<<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;
    }
    

    Pascal :

    program p22945;
    var f1,f2:array[0..500,0..500]of longint;
        i,j,k,n,l,m1,m2:longint;
        a,sum:array[0..500]of longint;
    begin
     readln(n);
     for i:=1 to n do
      begin
       read(a[i]);
       sum[i]:=sum[i-1]+a[i];
      end;
     fillchar(f1,sizeof(f1),0);
     fillchar(f2,sizeof(f2),0);
     for i:=2 to n do
      for j:=1 to n-i+1 do
       begin
        m1:=-maxlongint;m2:=maxlongint;
        for k:=1 to i-1 do
         begin
          if m1<f1[k,j]+f1[i-k,j+k] then
           m1:=f1[k,j]+f1[i-k,j+k];
          if m2>f2[k,j]+f2[i-k,j+k] then
           m2:=f2[k,j]+f2[i-k,j+k];
         end;
        f1[i,j]:=m1+sum[j+i-1]-sum[j-1];
        f2[i,j]:=m2+sum[j+i-1]-sum[j-1];
       end;
     writeln(f2[n,1]);
     writeln(f1[n,1]);
    end.
    
    • 1

    信息

    ID
    2171
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者