YTU.3134: 动态规划基础题目之数字三角形

版权声明:个人博客:www.jingyile.cn 萌新发博文积累经验,欢迎各位大佬指导!!! https://blog.csdn.net/JYL1159131237/article/details/78004052

3134: 动态规划基础题目之数字三角形

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 104  Solved: 66
[Submit][Status][Web Board]

Description

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.

Input

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.

Output

Your program is to write to standard output. The highest sum is written as an integer.

Sample Input

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

Sample Output

30

HINT

这是动归题目,要有动归思维,即便是递归也需要一点改进。

AC代码:

#include <iostream>
#include <stdio.h>
#define Max 101
using namespace std;
int d[Max][Max];
int num;
int MaxSum(int num)
{
    int i,j;
    for(i=num-1;i>=1;i--)
        for(j=1;j<=i;j++)
    {
        d[i][j]=max(d[i+1][j],d[i+1][j+1])+d[i][j];
    }
    return d[1][1];
}
int main()
{
    int i,j;
    scanf("%d",&num);
    for(i=1;i<=num;i++)
        for(j=1;j<=i;j++)
        scanf("%d",&d[i][j]);
printf("%d",MaxSum(num));
return 0;
}
动规入门题,这道题是从下而上的计算方式,

从底向上递推,除最后一行外,每一行的每个点的最大值等于自身加上下面一行对应左右两个点的最大值,从下往上递推,最顶部的即所求。比如下图所示。首先最后一行的最大值就是它本身。倒数第二行第一个数7就是输入的倒二行的第一个数2 + 4 和 2 +5 取最大值 。逐步递推到顶部。

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

这里写图片描述

最近整个人感觉特别的迷,感觉啥都不知道,好多算法学的一塌糊涂,所以决定从最基础的开始,重新学习。
 

展开阅读全文

没有更多推荐了,返回首页