数塔问题
问题简述:如图数塔中,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的数值和最大。
实现思想:动态规划
5
9
12 15
10 6 8
2 18 9 5
19 7 10 4 16
以上是输入样例。
MAX=59
9->12->10->18->10
以上是输出样例。
C++代码:
#include<iostream>
using namespace std;
int main()
{
int a[50][50][3],i,j,n;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
cin>>a[i][j][1];//数塔输入
a[i][j][2]=a[i][j][1];//a[i][j][2]用于存放路径数值和
a[i][j][3]=0;//用于存放路径下一结点位置,0代表向下,1代表向右下。初始化为0
}
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
{
if(a[i+1][j][2]>a[i+1][j+1][2])
{
a[i][j][2]=a[i][j][2]+a[i+1][j][2];
a[i][j][3]=0;
}
else
{
a[i][j][2]=a[i][j][2]+a[i+1][j+1][2];
a[i][j][3]=1;
}
}
cout<<"MAX="<<a[1][1][2]<<endl;
j=1;
for(i=1;i<=n-1;i++)
{
cout<<a[i][j][1]<<"->";
j+=a[i][j][3];
}
cout<<a[n][j][1];
return 0;
}