博客
关于我
数字三角形的无返回值的深度优先搜索解法
阅读量:354 次
发布时间:2019-03-04

本文共 1517 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要找到从顶部到底边的路径,使得路径上所经过的数字之和最大。路径只能向左下方或右下方移动。我们可以使用动态规划的方法来解决这个问题。

方法思路

  • 问题分析:我们需要在数字三角形中找到一条从顶部到底边的路径,使得路径上数字之和最大。每一步只能向左下或右下移动。
  • 动态规划:我们可以使用一个二维数组dp,其中dp[i][j]表示从顶部(0,0)到(i,j)位置的最大数字之和。对于每一个位置(i,j),它只能从左边(i-1,j)或右边(i,j-1)转移过来,所以dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + triangle[i][j]。注意当i=0或j=0时,只能从上面或左边转移。
  • 空间优化:为了优化空间复杂度,我们可以使用一维数组,因为每次只需要处理当前行的值,而不需要保存所有行的值。
  • 解决代码

    import static java.lang.Math.max;public class Main {    static int n;    static int[][] triangle;    static int ans = 0;    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        n = sc.nextInt();        triangle = new int[n][];        for (int i = 0; i < n; i++) {            triangle[i] = new int[i + 1];            for (int j = 0; j <= i; j++) {                triangle[i][j] = sc.nextInt();            }        }        if (n > 1) {            int[] dp = new int[n];            dp[0] = triangle[0][0];            for (int i = 1; i < n; i++) {                for (int j = 1; j <= i; j++) {                    dp[j] = max(dp[j - 1], dp[j]) + triangle[i][j];                }            }            ans = dp[n - 1];            System.out.println(ans);        } else {            System.out.println(triangle[0][0]);        }        sc.close();    }}

    代码解释

  • 读取输入:首先读取行数n,然后读取三角形的数字,构建二维数组triangle。
  • 初始化dp数组:使用一维数组dp来存储每一行的最大和,dp[0]初始化为triangle[0][0]。
  • 填充dp数组:对于每一行i,从左到右计算每个位置j的最大和。对于每个位置,dp[j] = max(dp[j - 1], dp[j]) + triangle[i][j]。
  • 输出结果:dp数组的最后一个元素即为从顶部到底边的最大和,输出结果。
  • 这个方法通过动态规划有效地解决了问题,确保了时间和空间复杂度的优化。

    转载地址:http://gvwg.baihongyu.com/

    你可能感兴趣的文章
    如何利用 Beautiful Soup 爬取网页数据
    查看>>
    Numpy 如何操作数组
    查看>>
    Win10 环境下安装压缩包版本 MySQL-8.0.13
    查看>>
    爬取网易科技滚动新闻
    查看>>
    vuex modules
    查看>>
    vue父子组件传参的4种方式
    查看>>
    中缀表达式转后缀表达式
    查看>>
    Java笔记:单链表
    查看>>
    Java基础题:小根堆为8,15,10,21,34,16,12,删除关键字8之后需重建堆,需要的比较次数为?
    查看>>
    Java基础题:哈夫曼树
    查看>>
    phthon基本语法——温习
    查看>>
    sleep、wait、yield、join——简介
    查看>>
    web项目配置
    查看>>
    VTK:相互作用之KeypressEvents
    查看>>
    VTK:相互作用之MouseEventsObserver
    查看>>
    VTK:相互作用之PickableOff
    查看>>
    VTK:相互作用之Picking
    查看>>
    VTK:Medical之MedicalDemo2
    查看>>
    libfacedetection库的配置及基本使用——内涵(cmake编译libfacedetection库)
    查看>>
    VS配置属性表,保存Opencv配置信息
    查看>>