NOIP2003年提高组复赛上机试题 加分二叉树

2023-10-29 08:18

本文主要是介绍NOIP2003年提高组复赛上机试题 加分二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NOIP2003年提高组复赛上机试题 加分二叉树

  • 1.问题分析
    • 1.1.区间DP
    • 1.2.对于此题
  • 2.具体代码
  • 3.总结

题目链接

  • 是否看了题解找思路

1.问题分析

(复习并实战区间dp)

1.1.区间DP

找到[l,r]中的最优解,[1,n]就是答案。
三重循环:
1.区间长度len
2.确定l,从而确定r=l+len-1
3.以k为根节点遍历此时的[l,r]区间。

1.2.对于此题

f[l,r]的含义是所有中序遍历是[l,r]的集合;属性为最大值。
f[l,r]的更新:
以k为root结点:
for(k:l~r){遍历以k为root节点的情况,更新f[l,r]。}
最后在设置path数组储存路径

2.具体代码

#include <iostream>
#include <cstdio>
using namespace std;
const int N = 35;
typedef long long ll;
ll f[N][N],w[N];
int path[N][N];
void print(int l,int r)
{    if(l>r)return;printf("%d ",path[l][r]);print(l,path[l][r]-1);print(path[l][r]+1,r);
}
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>w[i];f[i][i]=w[i];path[i][i]=i;}for(int len=2;len<=n;len++)//模板的套用{for(int l=1;l+len-1<=n;l++){int r=l+len-1;for(int k=l;k<=r;k++){ll left = k==l ? 1 : f[l][k-1];ll right= k==r ? 1 : f[k+1][r];if(f[l][r]<left*right+w[k])//递归的难点在于推导出状态转移方程{f[l][r]=left*right+w[k];path[l][r]=k;}}}}cout<<f[1][n]<<endl;print(1,n);return 0;
}

3.总结

一开始的时候写print函数有错误:

void print(int l,int r)
{printf("%d ",path[l][r]);if(l==path[l][r]||r==path[l][r])return;print(l,path[l][r]-1);print(path[l][r]+1,r);
}

递归退出的条件应该是[l,r]不存在,
l==path[l][r]||r==path[l][r]时,表示递归到了叶结点,还是需要输出的。

这篇关于NOIP2003年提高组复赛上机试题 加分二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/299402

相关文章

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

如何提高开发的效率,让老板不知所措的给你发工资

设计模式 UML JSP 编程 数据结构 1.你可能会常常发现,写了一段代码后,编译程序时是一大堆的出错 (原因:语法不熟)  ──别担心,这是每个程序员必须经历的事,这时候你就需要更大的耐心及细心,对每一行代码进行仔细人阅读并改正,这个很重要,这可以培养你的理解代码能力,所以要常读程序,不要等到程序运行以后才知道你的程序的结果。  ──如何避免:在写代码以前,要认真的学习计算机语

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具