1 条题解

  • 0
    @ 2025-2-14 21:26:47

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=101;
    int n,a[maxn],f[maxn][maxn]={0},root[maxn][maxn]={0};
    void init();
    void work();
    void print(int,int);
    int main()
    {
    	//freopen("tree1.in","r",stdin);
    	init();
    	work();
    	print(1,n);
    	return 0;
    }
    void init()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];	
    }
    void work()
    {
    	for(int i=0;i<=n;i++)//因为要求左右子树之积,所以要初始化为1 
    		for(int j=0;j<=n;j++) f[i][j]=1;
    	for(int i=1;i<=n;i++)
    	{
    		f[i][i]=a[i];//孤立点结果是自己本身
    		root[i][i]=i;//自己的根是自己 
    	} 
    	for(int d=2;d<=n;d++)//区间长度
    	{
    		for(int i=1;i<=n-d+1;i++)//起点 
    		{
    			int j=i+d-1;//终点
    			for(int k=i;k<=j;k++)
    			{
    				if(f[i][j]<f[i][k-1]*f[k+1][j]+a[k])
    				{
    					f[i][j]=f[i][k-1]*f[k+1][j]+a[k];
    					root[i][j]=k;
    				}
    			} 
    		}
    	} 
    	cout<<f[1][n]<<endl;
    }
    void print(int x,int y)
    {
    	int k=root[x][y];
    	if(k!=0)cout<<k<<' ';
    	if(root[x][k-1]!=0)print(x,k-1);
    	if(root[k+1][y]!=0)print(k+1,y);
    }
    

    Pascal :

    program plus_tree;
    var i,j,k,n,val:longint;
        f,way:array[0..100,0..100]of longint;
        a:array[0..100]of longint;
    procedure init;
    begin
      readln(n);
      for i:=1 to n do read(a[i]);
      fillchar(f,sizeof(f),0);
    end;{init}
    procedure try_movement(x,y:longint);
    var i:longint;
    begin
      if x>y then begin f[x,y]:=1;exit;end;
      if x=y then begin f[x,y]:=a[x];exit;end;
      for i:=x to y do
        begin
          if f[x,i-1]=0 then try_movement(x,i-1);
          if f[i+1,y]=0 then try_movement(i+1,y);
          val:=f[x,i-1]*f[i+1,y]+a[i];
          if val>f[x,y] then
            begin
              f[x,y]:=val;
              way[x,y]:=i;
            end;
        end;{for-i}
    end;{try}
    procedure print(x,y:longint);
    begin
      write(way[x,y],' ');
      if x=way[x,y]-1 then write(x,' ')
      else if x<way[x,y]-1 then print(x,way[x,y]-1);
      if way[x,y]+1=y then write(y,' ')
      else if way[x,y]+1<y then print(way[x,y]+1,y);
    end;{print}
    begin{main}
      init;
      try_movement(1,n);
      writeln(f[1,n]);
      print(1,n);
    end.
    
    • 1

    信息

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