加分二叉树

题的主要目的并没有难到我

难倒我的是求先序排列。。。

因为做法跟题解不一样,实现起来比较困难。。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int n,f[60][60]; 
struct node
{
    node(int a=0):w(a),l(NULL),r(NULL){}
    node* l;
    node* r;
    int w;
}tree;
int dfs(int l,int r,node* t)
{
    int u=0,x,y,k=0;
    if(l==r)
    {
        t->w==l;
        return l;
    }
    node* tl=new node();
    node* tr=new node();  
    for(int i=l;i<=r;i++)
    {
        if(i!=l) 
        x=dfs(l,i-1,tl);
        if(i!=r)
        y=dfs(i+1,r,tr);
        if(i==l&&f[l][r]<=f[i+1][r]+f[l][l])
        {
        f[l][r]=f[i+1][r]+f[l][l];
        u=i;
        }
        else if(i==r&&f[l][r]<=f[l][i-1]+f[r][r])
        {
        f[l][r]=f[l][i-1]+f[r][r];
        u=i;
        }
        else if(f[l][r]<=f[l][i-1]*f[i+1][r]+f[i][i]) 
        {
        f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i];
        u=i;
        }
        if(k!=u)
        if(x)
        tl->w=x;
        if(y)
        tr->w=y;
    } 
    if(u)
    t->w=u;
    if(u&&u+1<=r)
    t->r=tr;
    if(u&&u-1>=l)
    t->l=tl;
    return u;    
}
void preorder(node* t)
{
    if(t->w)
    cout<<t->w<<" ";
    if(t->l)
    preorder(t->l);
    if(t->r)
    preorder(t->r); 
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>f[i][i];
    dfs(1,n,&tree);
    cout<<f[1][n]<<endl;
    preorder(&tree);
}

 #2:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int n,f[60][60],root[60][60]; 
void dfs(int l,int r)
{
    int u=0;
    if(l==r)
    {
        root[l][r]=u;
        return;
    }
    for(int i=l;i<=r;i++)
    {
        if(i!=l) 
        dfs(l,i-1);
        if(i!=r)
        dfs(i+1,r);
        if(i==l&&f[l][r]<=f[i+1][r]+f[l][l])
        {
        f[l][r]=f[i+1][r]+f[l][l];
        u=i;
        }
        else if(i==r&&f[l][r]<=f[l][i-1]+f[r][r])
        {
        f[l][r]=f[l][i-1]+f[r][r];
        u=i;
        }
        else if(f[l][r]<=f[l][i-1]*f[i+1][r]+f[i][i]) 
        {
        f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i];
        u=i;
        }
    } 
    root[l][r]=u;
}
void preorder(int l,int r)
{
    int u=root[l][r];
    cout<<u;
        if(u-1>=1)
        preorder(l,u-1);
        if(u+1<=n)
        preorder(u+1,r);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>f[i][i];
    dfs(1,n);
    cout<<f[1][n]<<endl;
    preorder(1,n);
}

 #3:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int n,f[60][60],root[60][60]; 
void dfs(int l,int r)
{
    if(l>r)
    {
        f[l][r]=1;
        return;
    }
    if(l==r)
    return;
    int u=0;    
    for(int i=l;i<=r;i++)
    { 
        dfs(l,i-1);
        dfs(i+1,r);
        if(f[l][r]<f[l][i-1]*f[i+1][r]+f[i][i]) 
        {
        f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i];
        u=i;
        }
    } 
    if(u)
    root[l][r]=u;
}
void preorder(int l,int r)
{
    int u=root[l][r];
    if(l>r||!u)return;
    cout<<u<<" ";
        preorder(l,u-1);
        preorder(u+1,r);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>f[i][i];
    dfs(1,n);
    cout<<f[1][n]<<endl;
    preorder(1,n);
}

60分代码,TLE:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int n,f[60][60],root[60][60]; 
void dp(int l,int r)
{
    if(l>r)
    {
        f[l][r]=1;
        return;
    }
    if(l==r)
    {
    root[l][r]=l;
    return;
    }
    int u=0;    
    for(int i=l;i<=r;i++)
    { 
        dp(l,i-1);
        dp(i+1,r);
        if(f[l][r]<f[l][i-1]*f[i+1][r]+f[i][i]) 
        {
        f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i];
        u=i;
        }
    } 
    if(u)
    root[l][r]=u;
}
void preorder(int l,int r)
{
    int u=root[l][r];
    if(l>r||!u)return;
    cout<<u<<" ";
        preorder(l,u-1);
        preorder(u+1,r);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>f[i][i];
    dp(1,n);
    cout<<f[1][n]<<endl;
    preorder(1,n);
}

记忆化+DP,AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int n,f[60][60],root[60][60]; 
void dp(int l,int r)
{
    if(l==r)
    {
    root[l][r]=l;
    return;
    }
    if(~f[l][r])
    return;
    if(l>r)
    {
        f[l][r]=1;
        return;
    }
    
    int u=0;    
    for(int i=l;i<=r;i++)
    { 
        dp(l,i-1);
        dp(i+1,r);
        if(f[l][r]<f[l][i-1]*f[i+1][r]+f[i][i]) 
        {
        f[l][r]=f[l][i-1]*f[i+1][r]+f[i][i];
        u=i;
        }
    } 
    if(u)
    root[l][r]=u;
}
void preorder(int l,int r)
{
    int u=root[l][r];
    if(l>r||!u)return;
    cout<<u<<" ";
        preorder(l,u-1);
        preorder(u+1,r);
}
int main()
{
    memset(f,-1,sizeof f);
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>f[i][i];
    dp(1,n);
    cout<<f[1][n]<<endl;
    preorder(1,n);
}

 

posted @ 2018-12-13 13:46  JCRL  阅读(186)  评论(0编辑  收藏  举报