The Triangle

The Triangle

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 4
描述

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.

输入
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
输出
Your program is to write to standard output. The highest sum is written as an integer.
样例输入
5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5
样例输出
30


关键代码;

a[i][j] =a[i]a[j]+max(a[i+1][j],a[i+1][j+1]);

即将一个数改变为这个数加上它脚底下的两个数中最大的那个。也因为是从下往上走,所以调整值时是从i=n-2开始的。

#include <iostream>
using namespace std;
int max(int a,int b)
{
    if(a>b)
        return a;

    return b;
}
int main()
{
    int a[200][200];
    int n;
    cin>>n;
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<=i;j++)
            cin>>a[i][j];
    for(i=n-2;i>=0;i--)
         for(j=0;j<=i;j++)
         a[i][j] += max(a[i+1][j+1],a[i+1][j]);

    cout<<a[0][0]<<endl;
}

从下往上不是一选二,而是二选一,也就是说不管走哪条路,做完这个选择后到达的点是一样的,这个点肩膀上的两个数自然是唯一的,而如果是二选一选择后到达的点是不一样的,再往下走遇到的下一个选择也是不一样的,这样就有可能出现你做完第一个选择后,值是最大的,而做完第二个选择后,值反而不如走第二条路大,所以从下往上走是不能确定到底走什么样的路,值是最大的,只有走完了对比最终的值后才才知道走哪条路结果是最大的,而从下往上走就是不停地做二选一的选择,最后是归一的。

形象的说就好比一个三角形,从上往往下看是分散的,而从下往上看是归于一点的。


细节一定要注意:是<=i而不是<i,因为行也是从i=0开始的,所以表面上的第2行实际上是第3行,因为i是从0开始的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值