设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示
若要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。
输入
第一行为n(n<10),表示数塔的层数
从第2行至n+1行,每行有若干个数据,表示数塔中的数值。
输出
输出路径和最大的路径值。
样例输入
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
样例输出
86
有二种写法第一种是递归,另一种是递推
**递归:**
#include<stdio.h>
int n;
int a[100][100];
int h(int x,int y,int n)
{
int l,r;
if(x==n||y==n)
return a[x][y];
l=h(x+1,y,n);
r=h(x+1,y+1,n);
return l>r?l+a[x][y]:r+a[x][y];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
printf("%d\n",h(1,1,n));
return 0;
}
**递推:**
#include<stdio.h>
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int n;
int a[100][100];
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;j++)
a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);
printf("%d",a[1][1]);
return 0;
}