给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输入格式
第一行包含整数 n,表示数字三角形的层数。
接下来 n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。
输出格式
输出一个整数,表示最大的路径数字和。
数据范围
1≤n≤500,
−10000≤三角形中的整数≤10000
输入样例:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例:
30
思路:
用二维数组存放数字三形。
a( r, j) : 第r行第 j 个数字(r,j从1 开始算)
fun(r, j) : 从a(r,j)到底边的各条路径中,最佳路径的数字之和。
问题:求 fun(1,1)
D(r, j)出发,下一步只能走D(r+1,j)或者D(r+1, j+1)。故对于N行的三角形:
运行代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=1000;
int a[N][N],n;
int fun(int n)
{
for(int i=n-1;i>=1;i--)
{//从下向上遍历,按照输入格式发现在a[i][j]下的两个数分别为a[i+1][j],a[i+1][j+1];
for(int j=1;j<=i;j++)
{
a[i][j]=max(a[i+1][j],a[i+1][j+1])+a[i][j];//求出最大路径的和;
}
}
return a[1][1];//最大路径
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&a[i][j]);//输入格式为三角形;
}
}
cout<<fun(n)<<endl;
return 0;
}