首页 > 代码库 > 数字三角形算法

数字三角形算法

题目描述

显示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路


径,使该路径所经过的数字的总和最大。
 每一步可沿左斜线向下或右斜

线向下走;1<三角形行数<25;三角形中的数字为整数<1000;

输入

第一行为N,表示有N行后面N行表示三角形每条路的路径权.

输出

路经所过的数字总和的最大的答案。

样例输入

5

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出

30

易错点:首先要读懂题意,题目要的是从左向下或者是从右向下;实际图形是这样的

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
多以第二行的8是不能和第三行的8相加的。这一点很重要

本题思路是,先用一个二维数组把三角形的数字读进去,然后再开一个二位数组来存放 从上到下经过该点的最大值,每个点都只有两种情况,一是从它的正上方传下来的,还有就是从它的正上方的前一个传过来的。所以只要比较这两个的大小,然后 把较大的数的值给当前位置的数组的值。当然第一行和最后一行除外。第一行和最后一行单独赋值就可以。如图,比如第三行,到1的时候,可能加上左边的3后再加1较大,也可能加上上方的8之后再加上1较大,在这儿只需要比较一下,然后赋值就可以啦。

具体情况见代码。

#include<iostream>

using namespace std;
int main()
{
    int a[100][100],b[100][100];
    int i,j,N;
    cin>>N;
    for(i=0;i<N;i++)
        for(j=0;j<=i;j++)         //接收数字三角形的数字
            cin>>a[i][j];
    b[0][0]=a[0][0];
    for(i=1;i<N;i++)
    {
        for(j=0;j<=i;j++)
        {
            if(j==0)
                b[i][j]=b[i-1][j]+a[i][j];      //j为0时,即为第一行的相加
            else if(i==j)
                b[i][j]=b[i-1][j-1]+a[i][j];   //i=j时,即为最后一斜行相加;
            else
            {
            int x=b[i-1][j-1]+a[i][j];
            int y=b[i-1][j]+a[i][j];
            b[i][j]=x>y?x:y;
            }
        }
    }
    int max=b[N-1][0];
    for(i=0;i<N;i++)
        if(max<b[N-1][i])
            max=b[N-1][i];
    cout<<max<<endl;
}