问题描述:

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

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

如下图:

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))

int i,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

int solve(int i, int j){if(d[i][j]>0) return d[i][j];return d[i][j] = a[i][j] + ( i==n ? 0 : max(solve(i+1, j), solve(i+1, j+1) ) );
}

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

数字三角形问题 (动态规划初步)相关推荐

  1. python--lintcode109.数字三角形(动态规划)

    描述 给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上. 如果你只用额外空间复杂度O(n)的条件下完成可以获得加分,其中n是数字三角形的总行数. 您在真实的面试中 ...

  2. 数字三角形(动态规划经典例题)

    资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜 ...

  3. C语言数字三角形(动态规划)

    题目 总时间限制: 1000ms 内存限制: 65536kB 描述 图1给出了一个数字三角形.从三角形的顶部到底部有很多条不同的路径.对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到 ...

  4. 蓝桥杯 数字三角形 贪心+动态规划

    参考代码: #include<bits/stdc++.h> using namespace std; typedef long long ll; int data[105][105];in ...

  5. 动态规划初步--数字三角形

    数字三角形是一个由非负数组成的三角形,第n行有n个数,形如: 1 2 3 4  5 6 除最下行之外,每一行的左下和右下各有一个数,从第一行开始,向下,左或者右走一格,直到走到最后一行,所经过的路径上 ...

  6. C++数字三角形问题(动态规划)

    一.问题描述 ★问题描述:给字一个由n行数字组成的数字三角形(等腰三角形).试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. ★算法设计:对于给定的由n行数字组成的数字三 ...

  7. 数字三角形 计算最大路径 动态规划

    以所经过的权值之和最大值为例进行说明. 行进的过程中,每次只有两种选择:向左或向右.一个有n层的数字三角形的完整路径有2n条,所以当n比较大的时候,搜索全部路径,从中找出最大值,效率较低. 采用动态规 ...

  8. 【算法】【动态规划篇】第3节:数字三角形问题

    本期任务:介绍算法中关于动态规划思想的几个经典问题 [算法][动态规划篇]第1节:0-1背包问题 [算法][动态规划篇]第2节:数字矩阵问题 [算法][动态规划篇]第3节:数字三角形问题 [算法][动 ...

  9. 经典算法——数字三角形的三种解题方法:递推、记忆化搜索、动态规划

    上题目链接: http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1730.html  递推方法: i ...

最新文章

  1. 转载-隐藏在手机中的第二个操作系统
  2. Dependency 'mysql:mysql-connector-java:5.1.28' not found【解决方案】
  3. 异数OS 2017 DPDK 峰会观后感
  4. when is MethodInterceptorFilter created Java反射研究
  5. 【pyqt5学习】——给窗口添加图标
  6. java监听com口_简单了解Java接口+事件监听机制
  7. 工作169:vue项目报错[Vue warn]: Property “visible“ must be accessed with “$data.visible“ because properties
  8. 计算机目标导学方法,计算机教学计划
  9. mfc多线程编程实例_多线程技术的PLC与PC的通讯方式
  10. 2017.4.16 ArrayList初始默认容量(长度)
  11. error: cast from ‘void*’ to ‘int’ loses precision报错
  12. ubuntu下安装opencv2
  13. 截图工具Snagit试用免费激活方法
  14. 怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串
  15. 计算机域 用户怎么设置,电脑怎么加域设置
  16. linux系统下配置无线网卡的方法,linux系统下配置无线网卡的具体步骤
  17. 【UE4】使用Composure插件在场景或UI中实时显示CineCamera画面
  18. Gavin Wood的故事:神级黄皮书、出走以太坊、乱世成名与三代区块链
  19. vscode编辑器搜索小技巧
  20. JavaScript <script>

热门文章

  1. cmd mysql 报错_客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案
  2. java 找不到mysql驱动_java lib目录添加了mysql驱动包,仍然找不到class??
  3. 你真的做好数字化运营了吗?来直播间,给你加点儿“灵感”丨教育专题
  4. 游戏行业案例 | 99.7% 的充值玩家比例提升,从何而来?
  5. 神策数据荣登《中国企业家》2019 中国科创企业百强榜
  6. Java编程基础25——多线程上
  7. 招商银行的AI野心:转型金融科技公司?
  8. linux下通过命令来下载视频
  9. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)
  10. 【阿里云产品公测】大数据下精确快速搜索OpenSearch