比赛 |
动规 |
评测结果 |
AAAAAAA |
题目名称 |
加分二叉树 |
最终得分 |
100 |
用户昵称 |
皓芷 |
运行时间 |
0.002 s |
代码语言 |
C++ |
内存使用 |
0.30 MiB |
提交时间 |
2017-06-18 20:49:48 |
显示代码纯文本
#include<cstdio>
#define mysister
#define maxn 32
using namespace std;
long long n,w[maxn],ans=0,r[maxn][maxn],f[maxn][maxn];
int dfs(int u,int v)
{
f[u][v]=1;
if(u<v)for(int i=u;i<=v;i++)
{
int a=1,b=1;
if(f[u][i-1])a=f[u][i-1];
else if(u<=i-1)a=dfs(u,i-1);
if(f[i+1][v])b=f[i+1][v];
else if(i+1<=v)b=dfs(i+1,v);
if(a*b+w[i]>f[u][v])
{
r[u][v]=i;
f[u][v]=a*b+w[i];
}
}
else {f[u][v]=w[u];r[u][u]=u;}
return f[u][v];
}
void print(int u,int v)
{
if(r[u][v])printf("%lld ",r[u][v]);
if(r[u][v])print(u,r[u][v]-1);
if(r[u][v])print(r[u][v]+1,v);
}
int main()
{
freopen("jfecs.in","r",stdin);
freopen("jfecs.out","w",stdout);
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&w[i]);
printf("%d\n",dfs(1,n));
print(1,n);
return 0;
}