算法第三章上机实践
时间:2019-10-20
本文章向大家介绍算法第三章上机实践,主要包括算法第三章上机实践使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这次是第三章的实验,这里选择的题目是PTA上的第一题。
输入样例:
在这里给出一组输入。例如:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例:
在这里给出相应的输出。例如:
30
要求是数字三角形由上往下走,选择数字加起来最大的那条路径。
可以清晰看出子问题就是当前二维数组元素a[i][j]对下一行两个元素a[i+1][j]和a[i+1][j+1]的选择判断和相加。
但是当给出的数字三角非常的大的时候,重复计算子问题带来的时间复杂度是指数级的,效率十分低下,所以要用记忆化搜索动态规划,以优化基础的递归计算子问题的算法。
下面给出代码(参考自CSDN,我觉得思路非常明确)
#include<bits/stdc++.h> using namespace std; int method(int i,int j); int a[100][100]; int m[100][100]; int n; int main() { cin>>n; memset(m, -1, sizeof(m)); for(int i=0;i<n;i++) for(int j=0;j<=i;j++) cin>>a[i][j]; int result=method(0,0); cout<<result; } int method(int i,int j) { if(m[i][j]>=0) return m[i][j]; return m[i][j]=a[i][j]+(i==n-1?0:max(method(i+1,j),method(i+1,j+1))); }
这位网友的代码很清晰用两三行就把核心算法表示出来。m[i][j]表示的是当前位置到数字三角底部的最大距离。
上述程序仍然是递归的,但同时也把计算结果保存在数组m中。
题目中所各个数都是非负的,因此如果已经计算过某个m[i][j],则它应是非负的。这样,只需把所有m初始化为-1,即可通过判断是否m[i][j]>=0得知它是否已经被计算过。
由于i和j都在1-n之间,所有不相同的结点一共只有个。无论以怎样的顺序访问,时间复杂度均为
。
使用二维数组进行填表
,
空间复杂度也是
。
心得体会:
一开始难以理解递归的思路,描述不清,后来经过观察思考能够理解。
m[i][j]表示的是当前位置到数字三角底部的最大距离,这应该是三角形由下往上,通过return返回给上一级递归而逐渐累加的。
然后通过这次实践懂得了备忘录的使用方法,对于递归算法的优化是非常有帮助的,以后可以灵活运用。
原文地址:https://www.cnblogs.com/wuzixi1807/p/11708443.html
- 手动编写的几个简单的puppet管理配置
- 选择一款适合自己的ruby on rails IDE开发工具
- 微信的两种用途
- Sqlite快速上手使用指南
- 自动类型安全的.NET标准REST库refit
- 实现WebSocket和WAMP协议的开源库WampSharp
- Centos下部署DRBD+NFS+Keepalived高可用环境记录
- jQuery方法position()与offset()区别
- 温故而知新:设计模式之桥接模式(Bridge)
- 温故而知新:设计模式之装饰模式(Decorator)
- 域名“宝贝”baby.cn以71万元价格结拍
- 温故而知新:设计模式之组合模式(Composite)
- ruby学习笔记(7)-闭包
- ruby学习笔记(6)-Array的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《高效能程序员的修炼》读书笔记
- linux之centos7防火墙基本使用详解
- Ubuntu安装scrcpy完成手机投屏和控制(Ubuntu用QQ微信的另一种方法)
- CentOS7 systemd添加自定义系统服务的方法
- Linux中sudo、su和su -命令的区别小结
- 非零环绕规则
- Linux被中断的系统如何调用详解
- centos 修改ssh默认端口号的方法示例
- Linux中特殊权限SUID、SGID与SBIT的深入讲解
- linux新文件权限设置之umask的深入理解
- 在 CentOS 8/RHEL 8 上安装和使用 Cockpit的方法
- Linux删除文件提示Operation not permitted的处理办法
- 微任务与宏任务
- Linux 文件权限的详细介绍
- Linux统计一个文件中特定字符个数的方法