加分二叉树

来源:互联网 发布:淘宝商城首页女装 编辑:程序博客网 时间:2024/05/29 09:12

QAQ
递归分根节点去求最大值,记录每个区间最大值的节点,记录下来。
递归输出。
记忆化搜索AC

#include <cstdio>#include <iostream>#define ll long longusing namespace std;ll a[99999];ll ss[99999];ll maxd[999][999],root[999][999];ll dfs(int l,int r){    if(maxd[l][r]) return maxd[l][r];    int ans=0,id;    if(l>r) return 1;    if(l==r) return a[l];    for(int i=l;i<=r;i++)    {        ll d=dfs(l,i-1)*dfs(i+1,r)+a[i];        if(d>maxd[l][r])        {         root[l][r]=i;         maxd[l][r]=d;          }    }    //printf("%d ",id);    /*if(l+2==r)      printf("%d %d %d ",l,l+1,r);    else     printf("%d ",id);*/    return maxd[l][r];}void print(int l,int r){    if(l>r) return;    if(l==r)     {        printf("%d ",l);        return;    }    printf("%d ",root[l][r]);    print(l,root[l][r]-1);    print(root[l][r]+1,r);}int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++)     scanf("%lld",&a[i]);    ll ans=dfs(1,n);    /*for(int i=1;i<=n;i++)     {        int d=dfs(1,i-1)*dfs(i+1,n)+a[i];        if(d>ans) id=i,ans=d;     }*/    printf("%lld\n",ans);     print(1,n);}
原创粉丝点击