美文网首页
数字三角形问题

数字三角形问题

作者: cceb9d5a8577 | 来源:发表于2017-12-03 17:11 被阅读4次

问题描述:

有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数。

从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来。如何走才能使得这个和尽量大?

如下图:

1

3   2

4  10  1

4   3   2   20

思考:把当前的位置(i,j)看成一个状态,然后定义状态(i,j)的指示函数d(i,j)为从格子(i,j)出发时能得到的最大和(包括格子(i,j)本身的值)。在这个状态定义下,原问题的解释d(1,1)。

状态状态转移:从格子(i,j)出发有两种决策。如果往左走,则走到(i+1,j)后需要求”从(i+1,j)出发后能得到的最大和”这一问题,即d(i+1,j)。类似的,往右走之后需要求解d(i+1,j+1)。

所以状态转移方程就是d(i,j)=max{d(i+1,j),d(i+1,j+1)}+a(i,j);

方法一:递推计算 (时间复杂度为O(n^2))

inti,j;

for(i=1; i<=n; ++i)//下标从1开始

d[n][i]=a[n][i];

for(i=n-1; i>=1; --i)

{

for(j=1; j<=i; ++j)

d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);

}

因为i是枚举的,因此在计算 d[i][j] 前,它所需要的d[i+1][j]和d[i+1][j+1]一定已经计算出来了

方法二:记忆化搜索(时间复杂度O(n^2)  首先memset(d,-1,sizeof(d))  将d全部初始化为-1

intsolve(inti,intj){

if(d[i][j]>0)returnd[i][j];

returnd[i][j] = a[i][j] + ( i==n ? 0 : max(solve(i+1, j), solve(i+1, j+1) ) );

}

题目中各个数都是非负的,这样只需要把d初始化为-1,即可通过判断是否d[i][j]>=0得知它是否已经被计算过。

来自http://blog.csdn.net/eagle_or_snail/article/details/51019088

相关文章

  • 动态规划 2020-03-17

    动态规划 动态规划重要的是:判断状态,状态转移方程 数字三角形 问题描述给定一个数字三角形,找到从顶部到底部的最小...

  • 动态规划

    基础DP POJ 3176: Cow Bowling数字三角形问题,DP方程不再赘述。代码如下 POJ 2229:...

  • 动规入门 - 数字三角形(从朴素递归到递推的四步优化)

    问题:给定一个由n行数字组成的数字三角形,如下图所示: 试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径...

  • 数字三角形问题

    问题描述: 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数。 从第...

  • 0039-数字三角形

    问题描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以...

  • Leetcode 120.Triangle

    这道题的大概意思是,给一个数字构成的三角形,要求找出一条路径使得路径数字之和最小。 比如下面这个三角形的数字和最小...

  • DP(dynamic programming)

    以数字三角形为例:给出一个数字三角形,从顶部到底部有很多路径,求路径最大和。如: 73 88 1 02...

  • 算法训练营 -- 数字三角形

    问题描述 给定一个高度为 n 的“数字三角形”,其中第 i 行(1<=i<=n)有 i 个数。(例子如下图所示) ...

  • 动态规划 数字三角形

    问题描述 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左...

  • 109. 数字三角形

    109. 数字三角形 描述 笔记 数据 评测 给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下...

网友评论

      本文标题:数字三角形问题

      本文链接:https://www.haomeiwen.com/subject/tjxzbxtx.html