数字三角形 给定一个由n行数字组成的数字三角形,试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。

给定一个由n行数字组成的数字三角形,试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。

题目:
问题:
  给定一个由n行数字组成的数字三角形,如下图所示:
   7
   3 8
   8 1 0
   2 7 4 4
   4 5 2 6 5
  试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。
输入:
  第一行是数字三角形的行数,接下来 n 行是数字三角形中的数字。  
  比如:
  5
  7
  3 8
  8 1 0
  2 7 4 4
  4 5 2 6 5  
输出:
输出这个最大值。
  
这里只给出代码,步骤分析看链接:步骤详解

代码实现:
代码注释的部分构成方法二

#include
#include
#include 
#define N 5
int a[6][6];
int sum[6][6];
int sum_two[6];
int main()
{
    int i,j;
    for (i=1;i<=5;i++)
        for (j=1;j<=i;j++)
            scanf("%d",&a[i][j]);
    for (i=1;i<6;i++)
        {
            sum[5][i] = a[5][i];
           // sum_two[i] = a[5][i];
        }
    for (i=5-1;i>=1;i--)
        for (j=1;j<=i;j++)
            {
                sum[i][j] = max(sum[i+1][j],sum[i+1][j+1]) + a[i][j];
                //sum_two[j] = a[i][j] + max(sum_two[j],sum_two[j+1]);
            }
    for (i=1;i<6;i++)
        {
            for (j=1;j<=i;j++)
            printf("%3d",sum[i][j]);
            printf("\n");
        }
    //printf("%d",sum_two[1]);
    return 0;
}

你可能感兴趣的:(带有一定简单算法或技巧的编程题)