喂,你都趴在地上
半小时了,蚂蚁有
那么好看吗?
       /
STO . OPZ

你瞧,它在前进的路上
有很多种选择,它不知
道哪条路上有食物...
            /
STO .OPZ
           . .
          \█/
           ○
           ▪
          7
         / \
        3  8
       / \ / \
      8  1  0
    / \ / \ / \
   2  7   4  4
 / \ / \ / \ / \
4  5   2  6   5

         ○
        /█\
         ' '

一只蚂蚁从n行的数字三角形顶部出发往下爬,只能往左下或右下爬,问如何爬才能让它经过的数字和最大?

【输入】

第一行一个整数n,表示三角形行数

接下来的n行是数字三角形

【输出】

经过的数字总和最大值

【样例输入】

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

【样例输出】

30

【输出说明】

7+3+8+7+5=30

题解:

我的第一反应是搜索,但是......T!L!E!

因此我换了一种思路:用动态规划。

从顶部出发和从底部出发是一样的,

每个顶点更新为当前顶点的值加上下面两个顶点的值的最大值,从下往上搜索。

动规思路如下:

2 7 4 4        ==>   7 12 10 10

4 5 2 6 5              4  5   2   6   5

 

8 1  0          ==>   20  13  10

7 12 10 10            7   12  10    10

 

3    8           ==>    23  21

20  13  10              20 13 10

 

7                 ==>    30

23  21                   23 21

因此答案为30。

上代码

 1 #include<iostream>
 2 using namespace std;
 3 int a[105][105],b[105][105];
 4 int n;
 5 int main()
 6 {
 7     cin>>n;
 8     int i,j;
 9     for(i=1;i<=n;i++)
10         for(j=1;j<=i;j++)
11             cin>>a[i][j];
12     for(i=1;i<=n;i++)
13         b[n][i]=a[n][i];
14     for(i=n-1;i>=1;i--)
15         for(j=1;j<=i;j++)
16             b[i][j]=a[i][j]+max(b[i+1][j],b[i+1][j+1]);
17     cout<<b[1][1];
18     return 0;
19 }