数字三角形
时间限制:2 sec
空间限制:256 MB
问题描述
给定一个高度为 n 的“数字三角形”,其中第 i 行(1<=i<=n)有 i 个数。(例子如下图所示)
初始时,你站在“数字三角形”的顶部,即第一行的唯一一个数上。每次移动,你可以选择移动到当前位置正下方或者当前位置右下方的位置上。即如果你在 (i,j)(表示你在第i行从左往右数第j个数上,下同),你可以选择移动到 (i+1,j) 或 (i+1,j+1)。
你想让你经过的所有位置(包括起点和终点)的数字总和最大。求这个最大值。
输入格式
第一行一个正整数 n,表示数字三角形的大小。
第 2 行到第 n+1 行,第 i+1 行为 i 个用空格隔开的非负整数,描述数字三角形的第 i 行。
输出格式
一行一个整数,表示经过路径上数的最大总和。
样例输入
4
1
2 3
4 5 6
7 8 9 10
样例输出
20
样例解释
不停地向右下走即可。
数据范围
对于 50% 的数据,保证 n<=5。
对于 100% 的数据,保证 n<=1,000,保证数字三角形内的数不超过 10^6。
提示
[如果我们使用搜索算法,我们会在搜索时记录哪些信息呢?]
[当前到达的点的坐标、当前经过路径上数的总和!]
[总和显然是越大越好!]
[于是可以设计出状态:dp[i][j] 表示走到坐标为 (i,j) 的点时的最大总和。]
[很容易就可以设计出状态转移方程啦!]
另外,为了帮助大家完成题目,我们提供了只包含了输入输出功能的程序模板,也提供了含有算法的大部分实现细节的程序。
你可以根据自己的实际情况,在这些程序的基础上进行作答,或不参考这些程序,这将与你的得分无关。
这些程序可以从【这里】下载。