动态规划——数字三角形问题

题目:

  在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。三角形的行数大于1小于等于100,数字为 0 - 99。
  输入格式:

5 //表示三角形的行数 接下来输入三角形
    7
   3 8
  8 1 0
 2 7 4 4
4 5 2 6 5

要求输出最大和。

思路:

MaxSum(i,j):从第i行j列到底边的最大数字之和

从最后一行开始递推,MaxSum(n,j)=D(n,j)//n行j列,MaxSum(n-1,j) = D(n-1,j) + max( MaxSum(n,j) , MaxSum(n,j+1) )

然后为了减少空间,不需要用二维数组来存储MaxSum(n,j)的值,只需要求MaxSum(n,j)的时候存储下一行MaxSum(n+1,j)的值就可以,然后计算完第n行的MaxSum之后再覆盖原来的第n+1行的MaxSum的值。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int main(){
    int n;//表示三角形的行数
    int D[MAX][MAX];
    int *MaxSum;//指向一维数组
    int y=0;
    cin>>n;
    for (int i = 0; i < n;i++)
    {
        for (int j = 0; j <= i; j++)
        {
            cin>>D[i][j];
        }
    }
    MaxSum=D[n-1];//用二维数组的最后一行来存MaxSum的值;MaxSum(n-1,i)=D[n-1][i];
    for (int i = n-2; i >=0; i--)
    {
        for (int j = 0; j <=i; j++)
        {
            MaxSum[j]=D[i][j]+max(MaxSum[j],MaxSum[j+1]);
        }
        
    }
    cout<<MaxSum[0]<<endl;
    system("pause");
    return 0;
}

测试:

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值