数字三角形
链接:[USACO1.5] [IOI1994]数字三角形 Number Triangles
题目描述
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
在上面的样例中,从 7 → 3 → 8 → 7 → 5 7 \to 3 \to 8 \to 7 \to 5 7→3→8→7→5 的路径产生了最大权值。
输入格式
第一个行一个正整数 r r r ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
输出格式
单独的一行,包含那个可能得到的最大的和。
样例 #1
样例输入 #1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出 #1
30
提示
【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ r ≤ 1000 1\le r \le 1000 1≤r≤1000,所有输入在 [ 0 , 100 ] [0,100] [0,100] 范围内。
题目翻译来自NOCOW。
USACO Training Section 1.5
IOI1994 Day1T1
参考代码
这道题就是很裸的DP,也是很经典的入门题。我们先用记忆化搜索写一遍,再来写DP。
(1)记忆化搜索
我们首先读取金字塔的行数 r
和每行的数字,并存储在二维数组 triangle
中。然后,我们使用记忆化搜索的深度优先搜索函数 dfs
来计算从金字塔顶部到底部的最大路径和。
在 dfs
函数中,如果已经计算过当前位置到底部的最大路径和,我们直接返回结果;如果已经到达最后一行,我们返回当前值;否则,我们返回从当前位置到底部的最大路径和,并将结果存储在记忆化搜索数组 memo
中,以便后续使用。
最后,我们输出最大路径和。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Strea