HDOJ_2084:数塔 解题报告
来源:互联网 发布:金融大数据 编辑:程序博客网 时间:2024/06/05 11:37
要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
初始条件其实就是最底层的数值,递推关系是某一节点数值=自身数值+左右子节点数值的较大值。
看到有的人的代码是用二维数组,角标1为行号角标2为该行第几个元素,这样确实代码更好写,不过浪费了一倍的内存,我是用一位数组写的,每行第一个元素的序号需要求一下,略显麻烦。
//HDOJ_2084:数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?#include <iostream>using namespace std;int main(){ int i, j, k, h, n, t; cin >> n; for ( i=0; i<n; i++ ){ cin >> h; //h为塔的高度 t = h*(h+1)/2+1; //+1是因为舍弃了a[0]等含0元素 t比实际元素数大1 int *b = new int[t]; //记录加完下层最大值之后的数值 自底向上的加和 for( j=1; j<t; j++ ) cin >> b[j]; int s; for( j=h-1; j>0; j-- ){//j为行号 从h-1行自底向上循环 s = j*(j-1)/2; //s=第h-1行行首序号-1 for( k=1; k<=j; k++ ) b[s+k] += max(b[s+k+j],b[s+k+j+1]); //max函数返回最大值 } cout << b[1] << endl; } return 0;}如果需要输出路径,可以通过数组c记录每个点选择的是其左孩子[=0]还是右孩子[=1],即
for( k=1; k<=j; k++ ){ if( b[s+k+j] > b[s+k+j+1] ){ //s+k=当前元素序号 s+k+j=当前元素左下的序号 b[s+k] += b[s+k+j]; c[s+k] = 0; } else { b[s+k] += b[s+k+j+1]; c[s+k] = 1; }}
- HDOJ_2084:数塔 解题报告
- HD 2084 数塔 解题报告
- hdu 2084 - 数塔(解题报告)
- 【SHLQSH数】解题报告
- 单词数解题报告
- POJ_2676 数独解题报告
- 数的划分解题报告
- 【数论】MMT数解题报告
- HDOJ2072单词数 解题报告
- 蓝桥杯 黑洞数 解题报告
- 蓝桥杯 花朵数 解题报告
- [COGS371]亲和数解题报告
- (解题报告)HDU2010---水仙花数
- [cqoi2015]选数 解题报告
- 数独问题解题报告
- 取数游戏解题报告
- 组合数问题 解题报告
- 【矩阵取数游戏】解题报告
- pyhton cmd模块
- servlet(doPost方法)
- wrriting clean word—瞌睡龙的建议
- 华为
- 第二周上机任务1-1---编写递归函数将十进制数转换成二进制数输出
- HDOJ_2084:数塔 解题报告
- 男人的责任,你能做到吗?
- Ufida U8v10.1 安装到sqlserver2008R2 故障转移集群
- linux c标准I/O函数
- COM中常用宏的总结
- HDOJ_1160:FatMouse's Speed 解题报告
- 【Cortex-M0】2 ARM概述
- win7造字(不全好用)
- HDOJ_1159:Common Subsequence 解题报告