您的位置:首页 > 其它

Noip 2003 加分二叉树

2017-11-07 07:50 375 查看
#include<cstdio>

int n,a[50],f[50][50],root[50][50];

void dfs(int l,int r)
{
if (l>r) return;
printf("%d ",root[l][r]);
dfs(l,root[l][r]-1);
dfs(root[l][r]+1,r);
}

int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++) f[i][i]=a[i],root[i][i]=i,f[i][i-1]=1;
for (int i=n-1;i>=1;i--)
for (int j=i+1;j<=n;j++)
for (int k=i;k<=j;k++)
if (f[i][k-1]*f[k+1][j]+f[k][k]>f[i][j])
{
f[i][j]=f[i][k-1]*f[k+1][j]+a[k];
root[i][j]=k;
}
printf("%d\n",f[1]
);
dfs(1,n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: