这是对上次发布内容的补充与再加工;
数字金字塔问题:从最上面一个数开始,可以加上这个数正下方或右下方的数(仅能加一个)
求加到最下面一行时的最优解。
1. | 2. | 3. | 4. | 5. | |
1. | 1 | ||||
2. | 5 | 8 | |||
3. | 9 | 2 | 7 | ||
4. | 0 | 2 | 5 | 6 | |
5. | 4 | 7 | 1 | 0 | 3 |
我们设这个金字塔为一个二维数组a[5][5],局部最优解为f(i,j)(i,j)就是这个元素在二维数组的坐标;
输入二维数组的每个元素后进行分析:
1.每个元素都有局部最优解,最优解就是这个元素上面的局部最优解加上这个元素;
2.已知第一行仅有一个元素,则第一行元素(1,1)的最优解就为它本身,例题中就是1;
3.接下来每行每个元素的最优解就是它上面两个元素中局部最优解大的那个,
即f(i,j)=max(f(i-1,j),f(i-1,j-1))+a[i,j];
4.比较最后一行最优解大小并找出最大值;
#include<iostream>
using namespace std;
int main()
{
int a[100][100]/*记录数字三角形*/,f[100][100]/*记录局部最优值*/,i,j,n=0,m=0;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin>>a[i][j];//输入数字金字塔
f[1][1]=a[1][1];
for(i=2;i<=n;i++)
for(j=1;j<=i;j++)
f[i][j]=max(f[i-1][j],f[i-1][j-1]);
/*寻找局部最优解(最大值)*/
for(i=1;i<n;i++)
m=max(m,f[n][i]);
/*比较最后一行的局部最优解大小并记录最大值*/
cout<<m;
/*输出最大值*/
}
注:二维数组可以从(0,0)开始,但为了方便,我从(1,1)开始了,并不是无知呦。