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 }