动态规划-数塔路径之和最大值及路径输出问题
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]
相关文章推荐
- 动态规划_最大子路径和问题
- 动态规划--最大子序列问题
- 经典动态规划问题——最大子段和问题
- 紫书p263 嵌套矩形如何输出所有路径(DAG上的动态规划)
- 动态规划求解从矩阵左上角到右下角的最大受益问题
- 动态规划问题学习路线:斐波那契数列,最大递增子序列,松鼠捡苹果,最大公共子序列,字符串编辑距离
- 动态规划之最大子段和问题总结
- 用拓扑排序+动态规划的方法输出DAG的所有可能的路径
- 动态规划实例(七):01背包问题最大价值
- 动态规划---实现输出最大公共子序列的长度以及输出最大子字符串(java语言描述)
- 线性规划与网络流24题之数字梯形问题 最大权不相交路径
- 0-1背包问题;动态规划;时间复杂度O(n方);给出最大价值与解得情况;内有动态规划思路总结;
- 题目1025:最大报销额(动态规划之01背包问题)
- 动态规划问题-DP 最大子段和O(n)解决方法
- 动态规划之所有点对的最短路径问题(Floyd算法)
- 线性规划与网络流24题之最长k可重区间集问题 最大权不相交路径(最大费用最大流)
- UniquePaths,UniquePaths2,路径问题。动态规划。
- 动态规划3——最大公共子序列问题
- 阿里云笔试题:最大子段和问题的动态规划解法
- 动态规划-最大子数组和问题