题目相关:
  3805相关链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5337
  在二维的矩形上, 机器通过管道(pipe)连接(I型, L型),最终成为一个系统.
  
  其规则大致提炼如下:
  1). 编号大的输出可以成为编号小的输入(隐含拓扑序), 编号1只有输入/没有输出.
  2). 每个节点最多有两个输入(弱化的图, 可以用二叉树来模拟)
  3). 矩形世界没有高度限制, 但有宽度限制
  目标就是: 
  最能满足要求的最小宽度是多少?

思路解析:
  本题隐含拓扑序(有向图), 同时每个节点最多两个子节点, 因此我们采用二叉树去模拟. 这种最优化问题, 有可能是动态规划(树形DP), 通过观察和琢磨. 可得出如下结论:
  如果节点i存在子节点j, k, 若节点j的宽度==节点k的宽度, 则取子节点宽度+1, 若子节点不相同, 则取子节点最大宽度的.
  转化为公式如下:

      {   node(j) + 1;         if node(j) == node(k)   --(1)
node(i) = {    {   max(node(j), node(k));   if node(j) != node(k)   --(2)

  其二叉树的是偏向树, 构建的时候, 往一个方向倾斜就是了.

AC代码:

#include <cstdio>#include <vector>
#include <stack>#include <functional>struct tree_node_t {int left_index;int right_index;int value;tree_node_t(int li = -1, int ri = -1, int v = -1): left_index(li), right_index(ri), value(v) {}
};class machine {
public:machine() {}// *) 输入数据并构建二叉树void init_and_buildtree(int n, const std::vector<int> &datas) {arr_tree.resize(n);for ( int i = 1; i < datas.size(); i++ ) {int idx = datas[i] - 1;if ( arr_tree[idx].left_index == -1 ) {arr_tree[idx].left_index = i;} else {arr_tree[idx].right_index = i;}}}// *) 计算结果// *) 这边采用模拟堆栈的方式, 来实现递归调用, 因为节点有10000个. // *)最差情况会导致二叉树成链表, 导致递归的调用栈达到10000int calculator() {std::stack<int> frames;frames.push(0);while ( !frames.empty() ) {int idx = frames.top();const int &li = arr_tree[idx].left_index;const int &ri = arr_tree[idx].right_index;if ( li != -1 && arr_tree[li].value == -1 ) {frames.push(li);} else if ( ri != -1 && arr_tree[ri].value == -1 ) {frames.push(ri);} else {if ( li == -1 ) {arr_tree[idx].value = 1;} else if ( li != -1 && ri == -1 ) {arr_tree[idx].value = arr_tree[li].value;} else if ( li != -1 && ri != -1 ) {if ( arr_tree[li].value == arr_tree[ri].value ) {arr_tree[idx].value = arr_tree[li].value + 1;} else {arr_tree[idx].value = std::max(arr_tree[li].value, arr_tree[ri].value);} }frames.pop();}} return arr_tree[0].value;}public:std::vector<tree_node_t> arr_tree;
};int main()
{int n;while ( scanf("%d", &n) != EOF ) {std::vector<int> datas(n, 0);for ( int i = 1; i < n; i++ ) {scanf("%d", &datas[i]);}machine instance;instance.init_and_buildtree(n, datas);printf("%d\n", instance.calculator());}return 0;}

  评注: 这边采用堆栈的方式来模拟递归调用, 是因为担心堆栈太深, 不过实际测试数据集, 没那么变态, 用递归的方式实现, 不仅优雅而且编码效率更高.

递归代码片段:

   // *) 递归函数, 划分子问题
int evaluate(int idx) {int li = arr_tree[idx].left_index;int ri = arr_tree[idx].right_index;if ( li != -1 ) {evaluate(li);} if ( ri != -1 ) {evaluate(ri);} if ( li == -1 ) {return arr_tree[idx].value = 1;} else if ( li != -1 && ri == -1 ) {return arr_tree[idx].value = arr_tree[li].value;} else {if ( arr_tree[li].value == arr_tree[ri].value ) {arr_tree[idx].value = arr_tree[li].value + 1;} else {arr_tree[idx].value = std::max(arr_tree[li].value, arr_tree[ri].value);}}return arr_tree[idx].value;}// *) 驱动函数
int calculator() {return evaluate(0);
}

  

ZOJ 3805--解题报告相关推荐

  1. [zz][ZOJ Monthly]October 2008解题报告

    Connect4 Connect Four(Author: SONG, Yu[EZdestroyer]) 题目的背景就是Linux下的同名游戏,两个人在7*7的槽里轮流扔棋子,每次棋子都扔进某一列,棋 ...

  2. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  3. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  4. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  5. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  6. 解题报告(十三)中国剩余定理(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  7. 解题报告(四)生成函数(ACM/ OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  8. 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  10. 解题报告(五)组合计数(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. python保存代码_python操作文件读写新增保存代码
  2. java 之 网络编程
  3. SignalR学习笔记(三)Self-Host
  4. “智慧灯杆”的应用和解决方案
  5. 【Python】Pygame入门
  6. mpvue 微信小程序api_基于mpvue构建微信和支付宝小程序(1)
  7. pip更新后怎么还是旧版本_微信号不能修改第二次怎么办?微信更新后还是不能修改微信号怎么办?...
  8. 逐步理解SpringMVC
  9. APM 、PX4, PIXHAWK
  10. 【云原生之Docker实战】使用Docker部署OpenKM文档管理系统
  11. 潜在数学中 放眼数学外——记中国科学院院士、复旦大学教授李大潜zz
  12. 雷蛇zGold与Nexon America建立全球合作伙伴关系
  13. 动画讲算法,终于来了!
  14. 西电C++期末考点整理
  15. 通过设置CSS属性来实现鼠标悬浮放大或缩小区域
  16. 湖北大学计算机考入清华,697分考入清华却退学,襄阳学霸高考二刷699分!一心入行人工智能...
  17. 项目外包跟人力外包_您应该外包下一个开源项目吗?
  18. 画板格式化记录(优化布局)
  19. python面向对象基础知识
  20. Python import 功能(进阶篇)

热门文章

  1. 浅析Linux IO
  2. 数据质量和模型调优哪个更重要?
  3. 十分钟了解算法面经:百度,寒武纪,作业帮,科大讯飞等常面问题
  4. 《数据竞赛白皮书·下篇》发布,开源办好一场数据竞赛的实践方法论
  5. 字节跳动内部 MySQL 学习笔记火了,完整版开放下载!
  6. 谈一谈我对AI项目落地的看法
  7. 来看看顶会大佬是如何研究计算机视觉的
  8. 2020年最新全球大学学术排名出炉
  9. 7000 字读懂互联网公司的架构演变历程
  10. 碉堡的小程序:用 Python 制作演示迷宫算法的 gif 动画