当前位置: 首页 > news >正文

算法设计与分析5(动态规划)

动态规划的基本思想

将一个问题划分为多个不独立的子问题,这些子问题在求解过程中可能会有些数据进行了重复计算。我们可以把计算过的数据保存起来,当下次遇到同样的数据计算时,就可以查表直接得到答案,而不是再次计算

动态规划的例子

找两个字符串匹配的编辑距离

字符串的编辑距离,又称为Levenshtein距离,是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。操作包括增删改
**问题:**给定两个字符串A:sun和B:sautr,求字符串A至少经过多少步字符操作变成字符串B
解:
用<i,j>表示字符串A长为i,字符串B长为j的字符串编辑距离
对两个字符串,最末位字符进行讨论
相同:那么末位字符不需要进行操作,那么<i,j>=<i-1,j-1>
不相同:
可以做三种操作:
Ⅰ:增加一个字符:
增加后,末尾字符相同,问题变成i+1长的字符串A与j长的字符串B匹配
<i,j>=<i+1,j>+1,+1是此次做的增加操作
又由上可知<i,j>=<i-1,j-1>,所以
<i,j>=<i,j-1>+1
Ⅱ:删
同理,<i,j>=<i-1,j>+1
Ⅲ:改
同理,<i,j>=<i-1,j-1>+1
做矩阵图,<i,j>框内数字表示A前i个字符与B前j个字符匹配时,最小修改次数,由图可知,确定它的最小值,如果末尾字符相同,则等于左侧对角线值,不相等,则从周围三个数值中,选最小的+1

在这里插入图片描述

背包问题

**问题:**有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?
假设现在有四个物品,背包容量为8

i(编号) 1 2 3 4
w(体积) 2 3 4 5
v(价值) 3 4 5 6

解:
矩阵图中<i,j>表示从下标为 [0 - i] 的物品里任意取,放进容量为j的背包,价值总和最大是多少。
每次我们有两种选择:
将物品放入背包:加该物品的重量和价值
不放入:保持原来的数值
如果容量为3,可以选择的物品有1,2,3
那么我们只需要比较<i-1,j>,<i-1,j-w(i))>+v(i)
其中<i-1,j>表示不装该物品,<i-1,j-w(i))>+v(i) 表示装了该商品,背包容量减少w(i),但价值增加了v(i);
取两者中最大值即可
在这里插入图片描述

http://www.dtcms.com/a/112154.html

相关文章:

  • Go+Gin实现多文件上传
  • Linux: 系统内核中的信号
  • 【NLP 53、投机采样加速推理】
  • 【CMake】《CMake构建实战:项目开发卷》笔记-Chapter8-生成器表达式
  • LIO-SAM跑自己的数据集
  • 局域网:电脑或移动设备作为主机实现局域网访问
  • MyBatis操作数据库(1)
  • linux安装redis
  • PyTorch使用(7)-张量常见运算函数
  • AIGC实战——CycleGAN详解与实现
  • NVIDIA AgentIQ 详细介绍
  • 从Keep-Alive到页面关闭:解决Vue和React生命周期函数不触发的实战技巧
  • 相干光信号处理的一些基础知识
  • Spring依赖注入最佳实践:应对接口多实现的挑战
  • Centos7.9怎样安装Mysql 5.7
  • MySQL数据库如何在线修改表结构及字段类型?
  • FreeRTOS/任务创建和删除的API函数
  • HTML表单属性1
  • 线程同步与互斥(上)
  • 计算机通识
  • NB-IoT单灯控制器:智慧照明的“神经末梢”
  • 蓝桥杯嵌入式第15届真题-个人理解+解析
  • 【系统】换硬盘不换系统,使用WIN PE Ghost镜像给电脑无损扩容换硬盘
  • Python3.13安装教程-2025最新版超级详细图文安装教程(附所需安装包环境)
  • PhotoShop学习04
  • 详解大模型四类漏洞
  • Vue2+Vue3 45-90集学习笔记
  • P12013 [Ynoi April Fool‘s Round 2025] 牢夸 Solution
  • CMAKE中使用外部动态库
  • C++中,应尽可能将引用形参声明为const