蓝桥杯 ALGO-124 算法训练 数字三角形

算法训练 数字三角形  

时间限制:1.0s   内存限制:256.0MB

问题描述

  (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;


  .
  (图3.1-1)

输入格式

  文件中首先读到的是三角形的行数。

  接下来描述整个三角形

输出格式

  最大总和(整数)

样例输入

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

样例输出

30

分析:设f[i, j]为以三角形第i行第j列为终点的路径的最大总和。于是,有递推关系式

f[i, j] = \begin{cases} \max \{ f[i-1, j-1] + a_{ij}, f[i-1, j] + a_{ij} \} & \text{ if } 1 \le j \le i - 1 \\ f[i-1, j] + a_{ij} & \text{ if } j = 0 \\ f[i-1, j-1] + a_{ij} & \text{ if } j = i \end{cases} (i \ge 1)

初始条件:f[0, 0] = a_{00}

#include <stdio.h>

int max(int a, int b)
{
    return a > b ? a : b;
}

int main()
{
    int n;
    int a[105][105] = { 0 }, f[105][105] = { 0 };

    scanf("%d", &n);
    for (int i = 0; i < n; ++i)
        for (int j = 0; j <= i; ++j)
            scanf("%d", &a[i][j]);

    f[0][0] = a[0][0];
    for (int i = 1; i < n; ++i)
    {
        for (int j = 0; j <= i; ++j)
        {
            if (j == 0)
                f[i][j] = f[i-1][j] + a[i][j];
            else if (j == i)
                f[i][j] = f[i-1][j-1] + a[i][j];
            else
                f[i][j] = max(f[i-1][j-1] + a[i][j], f[i-1][j] + a[i][j]);
        }
    }

    int ans = 0;
    for (int j = 0; j < n; ++j)
    {
        if (f[n-1][j] > ans)
            ans = f[n-1][j];
    }
    printf("%d", ans);

    return 0;
}
发布了221 篇原创文章 · 获赞 40 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/liulizhi1996/article/details/103994182
今日推荐