数塔问题
1945: 数塔问题
题目描述
观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。 每一步可以从当前点走到左下方的点也可以到达右下方的点。![]()

输入
第一个行包含R(1≤R≤1000),表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。
输出
单独的一行,包含那个可能得到的最大的和。
样例输入
5
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
样例输出
86
样例解释:13+8+26+15+24=86
不和贪心一样,贪心只是局部最优解,这一题可以用动态规划求出全局最优解
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[1000][1000]={0},c[1000][1000]={0},d[10]={1,2,3,4,5,6,7,8,9,10};
memset(d,0,sizeof(d));
for(int i = 0;i<10;i++){
cout<<d[i];
}
int b = 0;
cin>>b;
for(int i = 0;i<b;i++)
{
for(int j = 0;j<=i;j++)
{
cin>>a[i][j];
}
}
for(int i = 0;i<b;i++)
{
c[b-1][i]=a[b-1][i];
}
for(int i = b-2;i>=0;i--)
{
for(int j = 0;j<=i;j++)
{
c[i][j]=max(c[i+1][j],c[i+1][j+1])+a[i][j];//动态转移方程
}
}
cout<<c[0][0];
return 0;
}

浙公网安备 33010602011771号