动态规划数字三角形



给定一个由n行数字组成的数字三角形,设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
输入数据a[m][n]:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
最优解数组b[m][n]:

分析:

分析:
  这是一道典型的动态规划问题,求顶到底的一条路径数字总和最大,按照动态规划思想,从底往上,子问题的和大,那么父问题的和就大,所以在给数组打底子的时候,就要找大的
1、二位数组代表什么:b[i][j]代表从这个点一直走到最后的最大值
2、数组打底:b数组把n-1行填充起来
3、递推式:根据题目可知,要从n-2行往0行遍历,也就是从下往上。公式为:b[m][n]=max{ b[m+1][n]+a[m][n] , b[m+1][n+1]+a[m][n] }

#include<stdio.h>
#define n 5           //行数 

int main(){
    int **a=new int*[n];  //接收输入的数据 
    int **b=new int*[n];  //存放最优值,b[i][j]存放着a[i][j]到底端的最大路径的和 
    for(int i=0;i<n;i++){
        a[i]=new int[n];
        b[i]=new int[n];
    } 
    for(int i=0;i<n;i++){          
        for(int j=0;j<=i;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=0;i<n;i++)     //数组打底工作
        b[n-1][i]=a[n-1][i];
    for(int i=n-2;i>=0;i--){
        for(int j=0;j<=i;j++){
    b[i][j]=(b[i+1][j]+a[i][j])>(b[i+1][j+1]+a[i][j])?(b[i+1][j]+a[i][j]):(b[i+1][j+1]+a[i][j]);
        }
    }
    printf("%d\n",b[0][0]);
    return 0;
} 
运行截图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问题描述 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左...
    icecrea阅读 4,132评论 0 0
  • 题目要求 在上面的数字三角形中寻找一条从顶部到底边的路径(注意是底边),使得路径上经过的数字之和最大.路径上的每一...
    Co_zy阅读 3,211评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,354评论 0 33
  • kingli话语刚落,我还来不及问候谁母亲一声,车就进入洞中。有种第一次去公园玩爬铁管感觉,一根细长的铁管两手紧握...
    i理想am阅读 1,748评论 0 2
  • 没有平衡,只有选择 前段时间,五周岁的女儿先是咳嗽,接着半夜高烧,我和母亲连续几夜未睡好观察陪伴。由于孩子爸爸出差...
    keerqin阅读 2,905评论 2 7