从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何走才能使的这个和尽量大?
#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;
}