问题描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
图中给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。
输入形式
输入的是一行是一个整数
N (1 < N <= 100)
,给出三角形的行数。下面的
N
行给出数字三角形。数字三角形上的数的范围都在
0
和
100
之间。
输出形式
输出最大的和。并输出路径
#include<iostream>
using namespace std;
const int max_N = 100;
int N;
int a[max_N+10][max_N+10];
int maxa[max_N+10][max_N+10];
void showPath();
int main()
{
cin>>N;
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= i; j++)
{
cin>>a[i][j];
}
}
for (int i = 1; i <= N; i++)
{
maxa[N][i] = a[N][i];
}
for (int i = N; i > 1; i--)
{
for (int j = 1; j < i; j++)
{
if (maxa[i][j]>maxa[i][j+1])
{
maxa[i-1][j] = maxa[i][j] + a[i-1][j];
}
else
{
maxa[i-1][j] = maxa[i][j+1] + a[i-1][j];
}
}
}
cout<<maxa[1][1]<<endl;
showPath();
}
void showPath()
{
cout<<a[1][1]<<endl;
for (int i = 1,j = 1;i<N;)
{
if (maxa[i+1][j]>maxa[i+1][j+1])
{
cout<<a[i+1][j]<<endl;
i++;
}
else
{
cout<<a[i+1][j+1]<<endl;
i++;j++;
}
}
}
using namespace std;
const int max_N = 100;
int N;
int a[max_N+10][max_N+10];
int maxa[max_N+10][max_N+10];
void showPath();
int main()
{
cin>>N;
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= i; j++)
{
cin>>a[i][j];
}
}
for (int i = 1; i <= N; i++)
{
maxa[N][i] = a[N][i];
}
for (int i = N; i > 1; i--)
{
for (int j = 1; j < i; j++)
{
if (maxa[i][j]>maxa[i][j+1])
{
maxa[i-1][j] = maxa[i][j] + a[i-1][j];
}
else
{
maxa[i-1][j] = maxa[i][j+1] + a[i-1][j];
}
}
}
cout<<maxa[1][1]<<endl;
showPath();
}
void showPath()
{
cout<<a[1][1]<<endl;
for (int i = 1,j = 1;i<N;)
{
if (maxa[i+1][j]>maxa[i+1][j+1])
{
cout<<a[i+1][j]<<endl;
i++;
}
else
{
cout<<a[i+1][j+1]<<endl;
i++;j++;
}
}
}