数塔问题

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;
}

posted @ 2022-02-14 12:51  陈瑞淞  阅读(81)  评论(0)    收藏  举报