数塔问题
- 递推与递归
- 动态规划
1.onlineJ43:数塔问题
- 原题链接:http://oj.haizeix.com/problem/43
有一个由数字组成的三角形数塔,站在上一层的某个点,只能到达其下方左右的两个点。现在请找到一条从上到下的路径,使得路径上所有数字相加之和最大
1.递推法从上向下求和
- 由数塔中到达任意一点的数字和sum = 左上方数字和suml or 右上方数字和sumr + 该数字数值num
- 知到达该点最大和为
ans[x][y] = max(ans[x - 1][y - 1], ans[x - 1][y]) + num[x][y]
关键 - 遍历最后一行,找出最大的数字即为结果
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int num[1005][1005];
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= i; ++j){
scanf("%d", &num[i][j]);
}
}
//1.从两个方向取数值大的方向max(num[i - 1][j - 1], num[i - 1][j]);
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= i; ++j){
num[i][j] += max(num[i - 1][j - 1], num[i - 1][j]);
}
}
int ans = 0;
//2.遍历最后一行,找出最大的数字即为结果
for(int i = 1; i <= n; ++i){
ans = max(ans, num