您的位置:首页 > 其它

HDU-2084 数塔

2015-08-14 20:35 176 查看
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 100 + 5;
int c, n;
int tower[maxn][maxn];

int main()
{
scanf("%d", & c);
while(c --)
{
scanf("%d", & n);                       //输入行数
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= i; j ++)
scanf("%d", & tower[i][j]);     //输入数塔
for(int i = n - 1; i >= 1; i --)        //从倒数第二行开始 走到(1,1)
{
for(int j = 1; j <= i; j ++)
{
if(tower[i + 1][j] > tower[i + 1][j + 1])   //分支的比较
tower[i][j] += tower[i + 1][j];         //更新分支 就如同把倒数第二行2 18 9 5 更新为 21 28 19 21 这样不断更新到顶端
else
tower[i][j] += tower[i + 1][j + 1];
}
}
printf("%d\n", tower[1][1]);        //输出顶端元素即为最大和
}
return 0;
}
题意:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。 对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
题解:模拟写下每次节点的变换情况吧(最后一行没有分支 所以从倒数第二行开始更新)
9

12 15

10 6 8

2 18 9 5

19 7 10 4 16



9

12 15

10 6 8

21 28 19 21



9

12 15

38 34 29



9

50 49



59
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: