动态规划(二)暴力递归的优化之路——数字三角形最大路径和

本文探讨了如何解决数字三角形的最大路径和问题,从暴力递归出发,分析其超时原因,然后通过记忆型递归优化,降低时间复杂度至N²,同时介绍了动态规划的计算顺序,从最后一行开始向上填充,实现空间优化。总结了从递归到动态规划的转化方法,强调了辅助数组在避免重复计算中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

这里写图片描述

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

输入格式:

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

要求输出最大和

分析

从顶点开始,求最大和。每个点都有两种选择,左下还是右下,左下和右下哪个大不知道,我们可以把下面两个点看做是新的三角形,分别求出左下三角形和右下三角形的最大路径和,那么只需选择其中较大的即可加到当前顶点即可。这是一个递归过程。

f(int[] arr,int i,int j){
  return arr[i][j]+max(f(arr,i+1,j),f(arr,i+1,j+1));
}

这份伪代码未考虑递归的出口,出口就在最后一行,因为这个时候i和j都没有办法再增加,这时该顶点相当于没有继续往下走的走法,加号后面的部分略去即可。

递归代码

  /**
   * 
   * @param triangle
   *          数字三角形
   * @param i
   *          起点行号
   * @param j
   *          起点列号
   * @return 计算出的最大和
   */
  public static int maxSumUsingRecursive(int[][] triangle, int i, int j) {
    int</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值