您的位置:首页 > 其它

dp:数字三角形问题

2017-10-30 20:31 211 查看
/*
问题描述:给定一个由n行数字组成的数字三角形,如下图所示

7
3   8
8   1   0
2    7   4   4
4    5   2   6   5

试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

如上图最大值为30=7+3+8+7+5
*/
#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
int a[20][20],dp[20][20],i,j,n;//a[][]用于输入三角形,dp[][]表示动态规划的二位数字,每一次循环利用上一次循环剩下的值
cin>>n;//输入行数
for(i=0;i<n;i++)//输入三角形
for(j=0;j<=i;j++)
cin>>a[i][j];
for(i=0;i<n;i++)//初始化操作,让dp[][]最下面一层等于a[][]最下面一层
dp[n-1][i]=a[n-1][i];
for(i=n-2;i>=0;i--)//核心代码,从倒数第二层开始,每一层从左到右遍历,新值就是下面两个中最大的那一个加上自身
for(j=0;j<=i;j++)
dp[i][j]=a[i][j]+(dp[i+1][j]>dp[i+1][j+1]?dp[i+1][j]:dp[i+1][j+1]);
for(i=0;i<n;i++)//输出a[][]
for(j=0;j<=i;j++)
{
cout<<a[i][j]<<"  ";
if(j==i)
cout<<endl;
}
for(i=0;i<n;i++)//输出dp[][]
for(j=0;j<=i;j++)
{
printf("%-3d ",dp[i][j]);
if(j==i)
cout<<endl;
}
cout<<"最大值为"<<dp[0][0]<<endl;
return 0;
}


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