您的位置:首页 > 其它

动态规划-数塔路径之和最大值及路径输出问题

2013-07-24 15:39 295 查看

Description

考虑在下面被显示的数字金字塔。写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。

7
38
810
2744
45265

在上面的样例中,从7到3到8到7到5的路径产生了最大和:30

Input

第一个行包含R(1<=R<=1000),表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。

Output

单独的一行包含那个可能得到的最大的和并相应输出该最大和的路径

SampleInput

5
7
38
810
2744
45265



SampleOutput

30[code]路径:
73875
代码:
#include<iostream>
#include<string.h>
usingnamespacestd;
intnum[1002][1002],dp[1002][1002],path[1002];
intmax(inta,intb)
{returna>b?a:b;}
intmain()
{
//intc;
//cin>>c;
//while(c-->0)
//{
intn,i,j;
memset(path,-1,sizeof(path));
cin>>n;

for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
cin>>num[i][j];
dp[i][j]=num[i][j];
}
for(i=n-1;i>0;i--)
for(j=1;j<=i;j++)
{
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+num[i][j];
}
cout<<dp[1][1]<<endl;//输出最大值。
cout<<"路径:"<<endl;
cout<<num[1][1]<<"";//输出路径。
intm=dp[1][1],d=num[1][1],ti=1,tj=1;

for(i=2;i<=n;i++)
{m-=d;ti=i;
if(m==dp[ti][tj])
{
cout<<num[ti][tj]<<"";
d=num[ti][tj];
}
elseif(m==dp[ti][tj+1])
{
tj+=1;
cout<<num[ti][tj]<<"";
d=num[ti][tj];
}
}
return0;
}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: