题目概况
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方(即下面的正下方)的点也可以到达右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从 7→3→8→7→5 的路径产生了最大和为30
题目分析
首先维护一个简单的二维数组map,作为输入的金字塔数字。然后从倒数第二行开始,逐步更新每一行的每一个数字到达底部时的最大和。比如更新倒数第二行的第一个数字2,它可以到达正下方的4,求和为6,也可以到达右下方的5,求和为7,比较6与7,则更新2为7,其他类似。初始条件就是最后一行的数字,不发生变化,从而得到状态转移式子:
map[i][j] = max(map[i+1][j],map[i+1][j+1]) +map[i][j];(1<=i<n)
当然再为了节省空间,还可以把所有的数字都往最后一行上操作,不断地更新最后一行的数字
AC代码
#include<iostream>
#include<cmath>
#include<stdio.h>
#include<stdlib.h>
#include<cstdio>
#include<time.h>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int r;
int map[1005][1005];
int main()
{
cin>>r;
for(int i=1;i<=r;i++)
for(int j=1;j<=i;j++)
{ //输入数字三角形
cin>>map[i][j];
}
for(int i=r-1;i>=1;--i)
for(int j=1;j<=i;j++)
{ //从倒数第二行开始,一行一行地更新数据,到第一行第一个元素时即为最大值
map[i][j] = max(map[i+1][j],map[i+1][j+1]) +map[i][j];
}
cout<<map[1][1];
}