codevs 1090 加分二叉树

Posted 一入OI深似海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 1090 加分二叉树相关的知识,希望对你有一定的参考价值。

/*
根据中序遍历的性质 加上子树的类似递归处理 
嗯 是个石子归并
然而边界老写不对 还有循环顺序
一气之下写了记忆化....
几下每个区间的最优值由那个点分开 即子树的根是谁
然后递归输出来 注意先递左子树 后递右子树 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 35
using namespace std;
int n,f[maxn][maxn],v[maxn],c[maxn][maxn],pre[maxn],len;
void Dfs(int l,int r)
{
    if(l>r)return;
    int k=c[l][r];
    pre[++len]=k;
    Dfs(l,k-1);Dfs(k+1,r);
}
int DP(int l,int r)
{
    if(r<l)return 1;
    if(f[l][r])return f[l][r];
    for(int i=l;i<=r;i++)
      {
          int k=DP(l,i-1)*DP(i+1,r)+v[i];
          if(k>f[l][r])
            {
                f[l][r]=k;c[l][r]=i; 
          }
      }
    return f[l][r];
}
int main()
{
    //freopen("jfecs.in","r",stdin);
    //freopen("jfecs.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      scanf("%d",&v[i]);
    for(int i=1;i<=n;i++)
      f[i][i]=v[i],c[i][i]=i;
    printf("%d\n",DP(1,n));
    Dfs(1,n);
    for(int i=1;i<=n;i++)
      printf("%d ",pre[i]);
    return 0;
}

 

以上是关于codevs 1090 加分二叉树的主要内容,如果未能解决你的问题,请参考以下文章

codevs 1090 加分二叉树

1090 加分二叉树

基础练习区间DPcodevs1090 加分二叉树题解

P1040 加分二叉树

加分二叉树

加分二叉树