栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

加分二叉树(DP,记忆化搜索)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

加分二叉树(DP,记忆化搜索)

https://www.luogu.com.cn/problem/P1040

题意:给定一棵二叉树的前序遍历为1 2 3…n,二叉树的分数计算方式为:左子分数*右子分数+根节点分数,求:一种前序遍历达到该二叉树的最大得分。

分析:我们可以枚举1…n的节点为根节点,假设这次枚举的根节点为k,左子树的节点范围就是1到k-1,右子树是k+1到r。

设计DFS(l,r)去搜索节点范围l,r以谁为根分数最大即可。

#include 
//题意,对于一颗中序遍历已经确定的二叉树,如何确定前序遍历能让二叉树得分最高

using namespace std;

long long n,dp[50][50];
long long s[50][50],a[50];
long long DFS(int l,int r)
{
    if(l>r)
        return 1;
    if(l==r)
    {
        s[l][r]=l;
        return a[l];
    }
    if(dp[l][r])
        return dp[l][r];
    int score=0,num=-1;
    for(int i=l;i<=r;i++)
    {
        int temp=DFS(l,i-1)*DFS(i+1,r)+a[i];
        if(temp>score)
        {
            score=temp;
            num=i;
        }
    }
    s[l][r]=num;
    dp[l][r]=score;
    return score;
}
void preorder(int l,int r)
{
    if(l>r)
    return;
    cout<>n;
	 for(int i=1;i<=n;i++)
     {
         cin>>a[i];
     }
     cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769391.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号