从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何走才能使的这个和尽量大?
#include<iostream>
#include<cstring>
using namespace std;
int a[1000][1000];
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<=i; j++)
{
cin>>a[i][j];
}
for(int i=n-1; i>=0; i--)
for(int j=0; j<i; j++)
{
a[i-1][j]+=max(a[i][j],a[i][j+1]);//从两个数中选大的加
}
/*for(int i=0; i<n; i++)//输出操作完成的输入数据
{
for(int j=0; j<=i; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/
}
/*#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1000][1000];
int main()
{
int n;
cin>>n;
memset(a,0,sizeof(a));//建立n+1行和列的方阵,没有读入的补0
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
a[i][j]+=max(a[i-1][j-1],a[i-1][j]);//从两个数中选大的加
/*for(int i=1; i<=n; i++)//输出操作完成的输入数据
{
for(int j=1; j<=i; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/
int t=a[n][1];
for(int i=1;i<=n;i++)//找出最大的数
{
if(t<a[n][i])
{
t=a[n][i];
}
}
cout<<t<<endl;
return 0;
}
1、从下往上走,直到第一行第一个数一定是最大的
转换成下列存储形式
| 7 | ||||
| 3 | 8 | |||
| 8 | 1 | 0 | ||
| 2 | 7 | 4 | 4 | |
| 4 | 5 | 2 | 6 | 5 |
#include<iostream>
#include<cstring>
using namespace std;
int a[1000][1000];
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<=i; j++)
{
cin>>a[i][j];
}
for(int i=n-1; i>=0; i--)
for(int j=0; j<i; j++)
{
a[i-1][j]+=max(a[i][j],a[i][j+1]);//从两个数中选大的加
}
/*for(int i=0; i<n; i++)//输出操作完成的输入数据
{
for(int j=0; j<=i; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/
cout<<a[0][0]<<endl;
}
2、从上往下走,必须在最后一行中找到最大的那个数,且必须建立n+1行和列的方阵
| 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 7 | 0 | 0 | 0 | 0 |
| 0 | 3 | 8 | 0 | 0 | 0 |
| 0 | 8 | 1 | 0 | 0 | 0 |
| 0 | 2 | 7 | 4 | 4 | 0 |
| 0 | 4 | 5 | 2 | 6 | 5 |
/*#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1000][1000];
int main()
{
int n;
cin>>n;
memset(a,0,sizeof(a));//建立n+1行和列的方阵,没有读入的补0
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
a[i][j]+=max(a[i-1][j-1],a[i-1][j]);//从两个数中选大的加
/*for(int i=1; i<=n; i++)//输出操作完成的输入数据
{
for(int j=1; j<=i; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/
int t=a[n][1];
for(int i=1;i<=n;i++)//找出最大的数
{
if(t<a[n][i])
{
t=a[n][i];
}
}
cout<<t<<endl;
return 0;
}
本文介绍了一种寻找从三角形顶点到底边的最大路径和的算法。通过两种不同的实现方式,即从上往下和从下往上的遍历,来解决这个问题。文章提供了完整的C++代码示例,并解释了关键步骤。
1358

被折叠的 条评论
为什么被折叠?



