比赛 动规 评测结果 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;
}