3262:新数字三角形,考点:动规,保存最大值,适当剪枝

原题:http://bailian.openjudge.cn/practice/3262/

描述

 

图1给出了一个数字三角形。
从指定的一个数往下走,可以走到下一层上和它最近的左边的那个数或者右边的那个数。
任务:
给定数字三角形中的一个位置,求从它开始所能到达的最大数。

输入

输入数据包含多组测试数据,
对于每组测试数据:
输入的第一行是一个整数N (0 <= N <= 100),给出三角形的行数。
(当N为0时,表示测试结束,你不需要处理本组数据)
下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
接下来一行有两个数,R和C,表示起始点位于第R行第C个位置。

输出

输出若干行,每行对应一组测试数据的结果。

样例输入

1
2
1 1
5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5
1 1
6
88 
97 26 
39 16 47 
94 25 66 4 
64 49 20 36 27 
37 87 29 37 10 40 
2 1
0

样例输出

2
8
97

解法

与那道数字三角形差不多,只是要求的变成了最大值,要比较三个地方,左下角、右下角和自己。

有指定出发点R、C,所以可以只算一部分。(全部都算再输出R、C应该也能过)

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 int N;
 6 int result[105][105];
 7 int main()
 8 {
 9     while (cin >> N) {
10         memset(result, 0, sizeof(result));
11         if (N == 0)break;
12         for (int i = 1; i <= N; i++)
13             for (int j = 1; j <= i; j++)
14             {
15                 cin >> result[i][j];
16             }
17         int R, C;
18         cin >> R >> C;
19         for (int i = N - 1; i >= R; i--)
20             for (int j = C; j <= C+(i-R); j++)
21             {
22                 result[i][j] = max(max(result[i + 1][j], result[i + 1][j + 1]), result[i][j]);
23             }
24         cout << result[R][C] << endl;
25     }
26     return 0;
27 }

 

posted @ 2021-07-09 14:13  永远是个小孩子  阅读(134)  评论(0编辑  收藏  举报