资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;

   (图3.1-1)
输入格式
5 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

//要求输出最大和

样例输出
30

解题思路:
用二维数组D[r][j]存放数字三角形。
D(r,j)代表第r行第j列个数字
MaxSum(r,j)代表第r行第j列到底边的各条路径中,最佳路径的最大和。
问题就相当于求MaxSum(1,1)

典型的递归问题
D[r][j]出发,只能往下D[r+1][j]走或者往右下D[r+1][j+1]走

下面展示代码

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int MaxSum(int i,int j)
{if(i==n){return D[i][j];}else{int x=MaxSum(i+1,j);int y=MaxSum(i+1,j+1);return max(x,y)+D[i][j];}
}
int main()
{cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>D[i][j];}}cout<<MaxSum(1,1)<<endl;return 0;
}

注:这样在输入较多行的时候我们会发现超时。

原因:存在大量重复计算。在调用MaxSum【1】【1】的时候,会调用MaxSum[2][1]和MaxSum[2][2]各一次,调用MaxSum[2][1]和MaxSum[2][2]时,会分别调用MaxSum[3][1],MaxSum[3][2],MaxSum[3][3] 1,2,1次呈杨辉三角形,时间复杂度为指数级,对于n=100,肯定超时。

解决方案:如果每算出一个MaxSum(r,j)就保存起来,下次用到其值的时候直接取用,则可以免去重复计算,那可以用O(N^2)时间完成计算,因为三角形的数字总数是n(n+1)/2

数字三角形的记忆递归性动归程序

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int maxSum[MAX][MAX];//存放每一个数字到底边的最大和
int MaxSum(int i,int j)
{if(maxSum[i][j]!=-1)return maxSum[i][j];if(i==n){maxSum[i][j]=D[i][j];}else{int x=MaxSum(i+1,j);int y=MaxSum(i+1,j+1);maxSum[i][j]=max(x,y)+D[i][j];}return maxSum[i][j];
}
int main()
{cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>D[i][j];maxSum[i][j]=-1;}}cout<<MaxSum(1,1)<<endl;return 0;
}

递归转成递推:

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int maxSum[MAX][MAX];
int main()
{int i,j;cin>>n;for(i=1;i<=n;i++){for(j=1;j<=i;j++){cin>>D[i][j];}}for(i=1;i<=n;i++)maxSum[n][i]=D[n][i];//第n行本身就是到底边的最大和for(i=n-1;i>=1;--i)for(j=1;j<=i;j++)maxSum[i][j]=max(maxSum[i+1][j],maxSum[i+1][j+1])+D[i][j];//从倒数第二行往上遍历cout<<maxSum[1][1];return 0;
}

空间优化:
没必要用二维数组maxSum数组存储每一个MaxSum(r,j),只要从底层一行向上递推,那么只要一维数组maxSum[100]就行,即只要存储一行的MaxSum值就可以。

进一步考虑,连maxSum数组都可以不要,直接用D的第N行替代maxSum即可
节省空间,时间复杂度不变。

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int *maxSum;
int main()
{int i,j;cin>>n;for(i=1;i<=n;i++){for(j=1;j<=i;j++){cin>>D[i][j];}}maxSum=D[n];for(i=n-1;i>=1;--i)for(j=1;j<=i;j++)maxSum[j]=max(maxSum[j],maxSum[j+1])+D[i][j];cout<<maxSum[1]<<endl;return 0;
}

数字三角形(动态规划经典例题)相关推荐

  1. ヾ(o◕∀◕)ノヾ各种动态规划经典例题(新手向、多类型)

    ヾ(o◕∀◕)ノヾ各种动态规划经典例题(新手向.多类型) 一.前言 ヾ(・ω・`。)我把比较常见的类型的动态规划找了一些经典的例题,适合作为新手的入门例题,用于帮助我们对各种不同的动态规划有所了解,很 ...

  2. C++ 数字三角形(动态规划)

    一.题目 有三种方法实现: 这里就求权值之和最大的,最小的类似就不分析了. 1.自底向上  缺点:算法复杂,重复计算 2.自顶向下  缺点:重复计算,浪费时间 3.动态规划 思路和自底向上.自顶向下一 ...

  3. poj1163数字三角形动态规划

    很有意思的一题,递推动态规划,拿到这道题首先我们要想到开一个二维数组存这个三角形,然后我们发现如果这个三角形只有一层的话,到最底层的路线的长度和不就是自己本身么,然后从下向上走, 我们定义maxsum ...

  4. 运筹说 第69期 | 动态规划经典例题讲解

    通过前几期的学习,我们已经学会了动态规划的基本概念和基本原理,并且掌握了动态规划模型的建立和具体的求解方法,本期小编带大家学习动态规划在经济管理中的应用. 除了前面讲到的最优路径.资源分配问题外,动态 ...

  5. poj1163 数字三角形 (动态规划)

    试题链接:http://poj.org/problem?id=1163 1.记忆递归型(自顶向下) D[i][j]来存数字 典型的递归问题:D(r,j)出发,下一步只能走D(r+1,j)或者D(r+1 ...

  6. 动态规划经典例题:乘积最大连续子数组

    题目: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.例如数组:arr[]={1, 2, 3, -2, 4, -3 ...

  7. 动态规划经典例题:钢条切割

    一.递归算法 如果在第i个地方切割,就把钢条分为两个长度为i,n-i的钢条,问题转化为求这切割两个钢条的最大价值之和 考虑到不切割时的价值 只要比较不切割时的价值和所有切割情况价值和的最大值即可 递归 ...

  8. 动态规划经典例题-国王的金矿问题

    金矿问题 问题概述: 有一位国王拥有5座金矿,每座金矿的黄金储量不同, 需要参与挖掘的工人人数也不同.例如有的金矿储量是500kg黄金,需 要5个工人来挖掘:有的金矿储量是200kg黄金,需要3个工人 ...

  9. 动态规划经典例题解析

    一.不同路径问题 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角 ...

最新文章

  1. ubuntu 16.04 ROS + kinect v2 安装
  2. idea修改新的git提交地址
  3. OpenSceneGraph 3.2 版本修改点
  4. 回望2017:一个前端从业者砥砺前行的一年
  5. 用jquery在必填表单字段前加红星总结
  6. java数组的初始化方式
  7. 二进制数据(Image类型)从一个表存入另一个表
  8. 大数据分析对企业有什么影响
  9. linux下Apache默认安装路径
  10. 生成对抗网络系列—ACL-GAN
  11. mongodb系列之--mongodb 主从配置与说明
  12. NPAPI确实不安全,因为功能太强大
  13. Tapestry5的基础知识
  14. 服务器gpt安装系统bios设置,系统安装的两种模式:UEFI+GPT、BIOS+MBR-网络教程与技术 -亦是美网络...
  15. Ubuntu20.04安装搜狗输入法指南
  16. 2020年上半年信息安全工程师上午选择题及解析
  17. 衣带渐宽终不悔,为“指针”消得人憔悴(二)
  18. 测试自动化风险或成功的条款
  19. win10OneNote登录微软 账号登陆出现错误码0x80190001
  20. qq登录界面句柄_注册QQ飞车日服账号

热门文章

  1. 华为鸿蒙新浪微博,华为多款机型开启鸿蒙尝鲜:微博已适配HarmonyOS小尾巴
  2. 如何进阶TypeScript功底?一文带你理解TS中各种高级语法
  3. Netty导学之NIO,Channel、Buffer、Selector详解
  4. php撮合引擎,C++ Match Engine撮合引擎 安装搭建(ubuntu)
  5. yarn设置缓存,清除缓存
  6. 20201104CSP提高组训练
  7. 【YBT高效进阶】1基础算法/1逆推算法/2奇怪汉诺塔
  8. 全网最实用的 IDEA Debug 调试技巧(超详细案例)
  9. 新丽起危机,免费阅读再进击,内忧外患的阅文如何破局?
  10. TCP/IP协议栈 头部参数