观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
显然,在上面的样例中,从 7 \to 3 \to 8 \to 7 \to 57→3→8→7→5 的路径产生了最大。
首先明确该问题不是贪心算法,然后明确思路从上往下递推:
(1)读入。
(2)a[i][j]代表从上往下到达i行j列这个点所能达到的和的最大值。
从上往下到达(i,j)这个点所能达到的和的最大值,即为其上方和左上方两个数中大的那个加上它本身的值。
a[i][j]+=max(a[i-1][j-1],a[i-1][j])
代码:
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
#define rint register int
inline void read(int &x)//读入优化
{
x=0;int w=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
x=x*w;
}
const int maxn=1000+10;
int n,a[maxn][maxn],ans;
int main()
{
read(n);
for(rint i=1;i<=n;i++)
{
for(rint j=1;j<=i;j++)
{
read(a[i][j]);
a[i][j]+=max(a[i-1][j-1],a[i-1][j]);
ans=max(ans,a[i][j]);
}
}
cout<<ans<<endl;
return 0;
}
数媒202 syh