首页 > 其他分享 >P1040 [NOIP2003 提高组] 加分二叉树

P1040 [NOIP2003 提高组] 加分二叉树

时间:2024-03-03 17:00:37浏览次数:16  
标签:pre 10 sco string NOIP2003 ll 35 P1040 二叉树

原题链接

题解

计算分数是搜索
存储前缀注意细节

code

#include<bits/stdc++.h>
using namespace std;

#define ll long long

ll sco[35][35]={0};
string pre[35][35];
ll a[35]={0};
queue<ll> q;

inline void read(ll &x) {
    x = 0;
    ll flag = 1;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-')flag = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ 48);
        c = getchar();
    }
    x *= flag;
}

inline void write(ll x)
{
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}

string turn(ll x)
{
    string s;
    while(x)
    {
        char d='0'+x%10;
        s=d+s;
        x/=10;
    }
    return s;
}

ll ss(ll l,ll r)
{
    if(r<l)
    {
        sco[l][r]=1;
        pre[l][r]="";
        return 1;
    }
    if(l==r)
    {
        sco[l][r]=a[l];
        pre[l][r]=turn(l)+' ';//细节
        return a[l];
    }
    if(sco[l][r]) return sco[l][r];
    ll val=0,index;
    for(ll i=l;i<=r;i++)
    {
        ll next=ss(l,i-1)*ss(i+1,r)+a[i];
        if(next>val)
        {
            val=next;
            index=i;
            string add=turn(i);
            pre[l][r]=add+' '+pre[l][i-1]+pre[i+1][r];//细节每个数字后跟一个空格
        }
    }
    sco[l][r]=val;

    return sco[l][r];
}
int main()
{
    ll n;
    read(n);
    for(ll i=1;i<=n;i++) read(a[i]);

    ll index,val=0;
    write(ss(1,n));
    putchar('\n');
    cout<<pre[1][n]<<endl;
    return 0;
}

标签:pre,10,sco,string,NOIP2003,ll,35,P1040,二叉树
From: https://www.cnblogs.com/pure4knowledge/p/18050289

相关文章

  • 线索二叉树
    线索二叉树即从前、中、后序三种遍历中其中一种来看,树中的左右孩子都不会是空着的,都会指向对应的前驱和后驱。以中序遍历为例,二叉树线索化过程如下:先是树的结构typedefstructThreadNode{Elemetypedata;structThreadNode*lchild,*rchild;intltag,rtag;}Th......
  • DFS在二叉树上的表现
    原题跳转:洛谷B3642二叉树的遍历题目内容:二叉树的遍历题目描述有一个\(n(n\le10^6)\)个结点的二叉树。给出每个结点的两个子结点编号(均不超过\(n\)),建立一棵二叉树(根节点的编号为\(1\)),如果是叶子结点,则输入00。建好树这棵二叉树之后,依次求出它的前序、中序、后序列遍......
  • 不同序构造二叉树
    一、根据前序与中序构造二叉树前序遍历:确定根节点root,最左端的节点即为根节点中序遍历:确定根节点左右两边的节点,通过计算左右两边节点集合的大小对root左节点集合与右节点集合执行重复操作,不断确定小集合的根节点,最终可构造出一整棵二叉树树的存储可以采用定义类或结构体,这......
  • 94. 二叉树的中序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidinorder(structTre......
  • 145. 二叉树的后序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidpostorder(structT......
  • 144. 二叉树的前序遍历c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/voidpreorder(structTr......
  • leedcode 二叉树的前序遍历
    递归法:classSolution:def__init__(self):#初始化一个实例变量res用于存储前序遍历结果self.res=[]defpreorderTraversal(self,root:Optional[TreeNode])->List[int]:#如果根节点存在ifroot:#检查根......
  • 平衡二叉树
    平衡二叉树特点:任意节点左右子树的高度不超过1反例:10节点的左子树高度为0,右子树高度为3这是平衡二叉树这也是平衡二叉树如何保持平衡添加一个节点后,该树不再是平衡二叉树-》旋转左旋,多余左节点做右节点复杂的左旋10的多余左节点9。给予前父节点7作为右节......
  • 二叉树查找树遍历
    二叉树查找树遍历存放规则:小的存左边、大的存右边、一样的不存前序、中序、后序指的是当前结点的顺序前序:当前结点、左子节点、右子节点中序:左子节点、当前节点、右子节点后序:左子节点、右子节点、当前结点前序遍历中左右遍历完左树遍历右树从上到下,根节点->从左......
  • 二叉树
    cal的题目分类说到二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容再啰嗦一遍,所以以下我讲的都是一些比较重点的内容。相信只要耐心看完,都会有所收获。C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时......