1 条题解
-
0
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
- 上传者