The Triangle
Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Sample Output 30 Source
IOI 1994
|
自上至下DP解法:AOJ-64 数字三角形
现在使用记忆化搜索解决它。使用递归解法的时候,因为子树的重复计算(重叠子问题),效率十分低下。对于计算过的结点进行记忆化即可。注意边界。
代码如下:
/****************************************/
#include <cstdio>
/****************************************/
const int N = 105;
int mat[N][N], ans[N][N];
int row;
int dfs(int i, int j) {
if(i == row) return mat[i][j];//最后一行,返回自身。(递归边界)
if(ans[i][j]) return ans[i][j];
return ans[i][j] = max(dfs(i+1, j), dfs(i+1, j+1))+mat[i][j];//是从左边走上来的大还是右边?用大的
}
int main() {
scanf("%d", &row);
for(int i = 1; i <= row; i++) {
for(int j = 1; j <= i; j++) {
scanf("%d", &mat[i][j]);
}
}
printf("%d\n", dfs(1, 1));
return 0;
}