算法设计与分析(九)

利用遗传算法求解九城市最短路径问题 最短路径问题是图论中一个古老而经典的问题,它在计算机科学和运筹学领域具有广泛的应用。具体来说,最短路径问题指的是在一个带权图中找到两个顶点之间的最短路径,这里的“最短”是根据边的权重来定义的,可以是距离最短、时间最短或者成本最低。问题可以是单源最短路径(从一个顶点到其他所有顶点的最短路径)或者全对最短路径(图中任意两个顶点之间的最短路径)。在现实生活中,最短路径问题广泛存在于物流运输、网络通信、城市规划等多个领域。例如,运输公司需要找到从仓库到客户之间的最佳配送路线,以减少距离和时间成本; 阅读详情

712. Mininum ASCII Delete Sum for Two Strings

Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal.

Example1

Input: s1 = “sea”, s2 = “eat”
Output: 231
Explanation: Deleting “s” from “sea” adds the ASCII value of “s” (115) to the sum.
Deleting “t” from “eat” adds 116 to the sum.
At the end, both strings are equal, and 115 + 116 = 231 is the minimum sum possible to achieve this.

Example2

Input: s1 = “delete”, s2 = “leet”
Output:403
Explanation: Deleting “dee” from “delete” to turn the string into “let”,
adds 100[d]+101[e]+101[e] to the sum. Deleting “e” from “leet” adds 101[e] to the sum.
At the end, both strings are equal to “let”, and the answer is 100+101+101+101 = 403.
If instead we turned both strings into “lee” or “eet”, we would get answers of 433 or 417, which are higher.

Note

0 < s1.length, s2.length <= 1000.
All elements of each string will have an ASCII value in [97, 122].

思路

这道题在上周就在LeetCode看到了,当时在找动态规划的题目做,看到题目的时候瞬间傻了。这竟然能用动态规划解出来?看着明明很像贪心的题目啊。顺着贪心的思路想了一下,发现情况很复杂,要把情况分类的话一时半会弄不出来,于是放弃了。

刚好这一周老师讲了动态规划的几种常见题型,这道题属于“最小编辑距离”的小变种。课堂上听到“最小编辑距离”题目的解法时,我都惊了,感受就是原来还能这样做?所以这周就尝试着做一下类似的题目,练一下手。

  1. 首先我们定义,对于 n 个字符的字符串str,它的字符顺序为[1..n],不使用常用的[0..n-1]是因为我要用str[0]表示空字符。
  2. 对于两个字符串 s1 和 s2,状态空间的定义如下:
    cost[i][j]表示使s1[1..i]和s2[1..j] 相等的代价,即需要删除的字母的ASCII码之和。
    cost[0][j],表示s1是空串,s2为了与s1相等,需要把[1..j]的字母都删除掉。对于j=0的情况也类似处理。
  3. 所以我们可以得出以下状态转移方程:
cost[i][j]=min(cost_i + cost[i-1][j], cost_j + cost[i][j-1], diff + cost[i-1][j-1]);

(1) cost_i + cost[i-1][j]:删除s1[i]后,s1[1..i]与s2[1..j]相等。
(2) cost_j+ cost[i][j-1]:删除s2[j]后,s1[1..i]与s2[1..j]相等。
(3) diff + cost[i-1][j-1]:如果s1[i]等于s2[j,则不需要删除任何一个字母,代价diff为0,否则两个字母都要删除,代价为cost_i+cost_j。
4. 还有一点要注意的就是,在开始状态转移方程计算的循环之前,我们要初始化数组:

//初始化代价数组,s1或者s2变成空串需要的代价
for (int i = 1; i <= n; i++)
   cost[i][0] = s1[i - 1] + cost[i - 1][0];
for (int i = 1; i <= m; i++)
   cost[0][i] = s2[i - 1] + cost[0][i - 1];

代码

class Solution {

int min(int num1, int num2, int num3)
{
  if (num1 <= num2 && num1 <= num3) return num1;
  else if (num2 <= num1 && num2 <= num3) return num2;
  else return num3;
}

public:
    int minimumDeleteSum(string s1, string s2) 
    {
        int n = s1.size();
        int m = s2.size();
        int cost[n + 1][m + 1] = {0};
        int cost_i = 0;
        int cost_j = 0;
        int diff = 0;

		//初始化代价数组,s1或者s2变成空串需要的代价
        for (int i = 1; i <= n; i++)
          cost[i][0] = s1[i - 1] + cost[i - 1][0];
        for (int i = 1; i <= m; i++)
          cost[0][i] = s2[i - 1] + cost[0][i - 1];

        for (int i = 1; i <= n; i++)
          for (int j = 1; j <= m; j++)
          {

            cost_i = s1[i - 1];
            cost_j = s2[j - 1];
            //如果两个字母相同则保留,代价为0,否则同时删除,代价为ASCII码的和
            if (s1[i - 1] == s2[j - 1]) diff = 0;	
            else diff = cost_i + cost_j;
            cost[i][j] = min(cost_i + cost[i - 1][j], 		//删除s1的第i个字母
                             cost_j+ cost[i][j - 1],		//删除s2的第j个字母
                             diff + cost[i - 1][j - 1]);	//同时保留或删除两个字母
          }

        return cost[n][m];

    }
};
DRAM刷新refresh相关知识归类-基础小知识(三) RAM每一位数据都是通过芯片内的一个小电容充电(或低电平)存储的。但随着时间的推移,电容逐渐失去电荷。为避免丢失存储的数据,必须定期刷新以将电荷(如果存在)恢复到其原始级别。此刷新过程包括读取每个位的值,然后将其写回。在此“刷新”期间,内存被占用,无法执行加载或存储位等正常操作。知道了应该这么做,但怎么去做以及有什么办法更有效率去做,就是接下来要整理的内容。 阅读详情

相关推荐

别再为H桥烧MOS管发愁了!手把手教你用IR2104搭建稳定电机驱动(附自举电路详解)

本文详细解析了使用IR2104半桥驱动芯片构建高可靠H桥电机驱动电路的全过程。从芯片内部架构、自举电路原理到PCB布局技巧和实战调试方法,帮助工程师彻底解决MOS管烧毁问题。重点讲解了自举电容选型、死区时间控制等关键设计要点,并附有示波器实测波形分析,是电机驱动设计的实用指南。

我的博客 739

算法设计与分析基础(九)

算法设计与分析基础(九) 练习题 习题一 a. 为一个分治算法编写伪代码,该算法同时求出一个n元素数组的最大元素 和最小元素的值。 b. 假设n = 2k,为该算法的键值比较次数建立递推关系式并求解。 c. 请将该算法与同样问题的蛮力算法做一个比较。 解答: a. 算法思想 将数组A划分为大小大致相等的两个子数组;递归地对这两个子数组求最大元素和最小元素;将两个子数组的最大元素进行比较,返回数组A的最大元素,将其最小元素进行比较,返回数组A的最小元素;当n不超过2时,递归终止,此时最多通过一次比较就可得

BKSW.的博客 2952

通过python下载西门子技术中心文档

本篇文章纯粹记录如何下载通过python下载西门子技术中心文档,所下载文档完全自己学习使用,非商业用途

John_09040211的博客 561

算法设计与分析 实验九 LCS算法

最长公共子序列LCS算法

small_bright_的博客 419

【学习笔记】《基于φ-OTDR的分布式扰动传感系统定位算法研究-北交-通信与信息系统-吴》重点笔记

一、绪论 1.1 引言 光纤传感器的优点:跟电子传感器相比较,光纤传感器有诸多独特的优势:对电磁干扰免疫;具有很好的绝缘性和耐腐蚀性;灵敏度高,可测量微弱信息;可实现大范围监测和分布式传感,仅需一根传感光纤,更为经济便捷;传感光纤体积小、重量轻、可形变,适用于一些特殊应用场所;还有无需供电、耐高温、便于组网等等优点 光纤传感器的感知信号的方法:当探测光入射到光纤中时会发生散射并产生各种散射光...

qq_36045093的博客 2万+

西安电子科技大学841学长经验分享(总成绩第三名)

西安电子科技大学841学长经验分享(总成绩第三名)

qq_30953547的博客 1082

算法设计与分析作业九LCS算法

一、问题描述及解析: 二、算法核心步骤(伪代码)及图解: 三、代码实现: #include<iostream> #include<cstring> #include<stack> #include<algorithm> #define MAX 1010 using namespace std; int dp[MAX][MAX]; int...

littleshi00的博客 474

Vectorless dynamic动态功耗分析——Voltus

power 计算工具会根据设计信息和用户提供的activity和switching约束来生成虚拟的worst-case的power vector,难点在于哪些instances视为switching,在没有仿真的前提下如何确定开关的时间,使用timing文件(TWF)

qq_44347276的博客 2790

算法分析与设计(实验九LCS)

#include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <cstdlib> using namespace std; int lcs_len(string s1, string s2){ int len1 = s1...

qq_45506707的博客 246

RK3506开发板实战:5分钟搞定开源鸿蒙OpenHarmony5.1+星闪功能配置

本文提供了一份基于RK3506开发板快速配置开源鸿蒙OpenHarmony 5.1并启用星闪功能的实战指南。文章详细介绍了从开发环境搭建、系统镜像编译烧录,到星闪驱动加载验证、应用开发及性能调优的全流程,帮助开发者高效上手,将新一代短距无线通信技术应用于物联网项目。

time3的博客 656

2025美赛E题为农业留出空间(附代码+全保姆教程)Making Room for Agriculture

有机农业的核心在于减少化学投入,促进自然控制和可持续性。变量定义CCC: 作物种群III: 害虫种群PPP: 天然捕食者种群(蝙蝠、鸟类等)BBB: 生物多样性水平(以种类数量表示)SSS: 土壤健康指数(影响植物繁殖与作物生长)EEE: 农业生态系统的整体稳定性。

博客 1495

算法分析与设计作业九——LCS算法和背包算法

1.问题 (1):LCS算法: (2)背包算法: 非形式化描述: 一个旅行者准备随身携带一个背包。 可以放入背包的物品有n种,物品j的重量和价值分别为Wj,Vj,j=1,2…n 如果背包的最大重量限制是b,怎么选择放入背包物品以使得背包的价值最大。 组合优化问题: 其中xj,表示放入背包的第j种物品的数量 组合优化问题的目标函数和约束条件都是线性函数,称为线性规划问题。 2.解析 (1):LCS算法: (2):背包算法: 3.设计 (1):LCS算法: (2):背包算法: 4.分析 (1):

Hyacincy的博客 284

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 550

算法与分析设计九:LCS算法和背包算法

241

WPPPQQQE的博客 160

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

算法设计与分析(九):Dynamic

Maximum Length of Pair Chain You are given n pairs of numbers. In every pair, the first number is always smaller than the second number. Now, we define a pair (c, d) can follow another pair (a, b) if ...

weixin_43142208的博客 157

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

算法设计与分析——排序算法(九):基数排序

基数排序是一种用在卡片排序机上的算法,现在你只能在博物馆找到这种卡片排序机了。博物馆中的一张卡片有80列,在每一列上机器可以选择在12个位置中的任一处穿孔。通过机械操作,我们可以对排序机“编程”来检查每个卡片中的给定列,然后根据穿孔的位置将它们分别放人12个容器中。操作员就可以逐个容器地来收集卡片,其中第一个位置穿孔的卡片在最上面,其次是第二个位置穿孔的卡片,依此类推。 对十进制数字来说,每列只会用到10个位置(另两个位置用于编码非数值字符)。一个ddd位数将占用ddd列。因为卡片排序机一次只能查看一列,所

冯·诺依曼 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

算法分析与设计实践-作业九-LCS算法

一、问题果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列,即求最长公共子序列。 二、分析 (1)穷举法 (2)动态规划 Xi=﹤x1,⋯,xi﹥即X序列的前i个字符 (1≤i≤m) Yj=﹤y1,⋯,yj﹥即Y序列的前j个字符 (1≤j≤n) 若xm=yn(最后一个字符相同),则不难用反证法证明:该字符必是X与Y的任一最长公共子序列Z(设长度为...

qq_45601688的博客 222

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

Burst Balloons 题目 Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i yo...

Vilin的博客 359

算法设计技巧与分析(九):网络流(Network Flow)

文章目录网络流(Network Flow)网络流的性质割(cut)与流(flow)余量函数(Residual Capacity Function)与余量图(Residual Graph)增广路径(Augmenting Path)一、The Ford-Fulkerson Method二、EK算法(Minimum path length augmentation)最小增广路径长度(MPLA) 网络流(Network Flow) 网络是一个四元组(G,s,t,c),其中G=(V,E)是一个有向图,s和t是两个分

m0_52935007的博客 2986

算法设计笔记(九)递推方程与算法分析

递推方程实例: 例一:斐波拉契数列 例二:汉诺塔 先把n-1个盘子由A移到C,再把最底下的用伪码表示 插入排序:从后往前依次比较 最坏情况下的时间复杂度 ...

chenxiaoqinghua的博客 865

算法分析与程序设计-作业九

1.问题。

weixin_48997715的博客 133

算法分析与设计实验九-最大字段和

给定n 个整数(可以为负数)的序列<a1, a2, …【输入形式】输入整数个数n,整数序列。【输出形式】最大字段和及相应子序列。

iceslime的博客 248

算法分析与设计-作业九-最大子列和问题

1、问题 求解两个序列x,y的最大公共子列问题 2、解析 3、设计 void Max(int c[100][100], int B[100][100], char x[], char y[], int xn, int yn) { //i表示数组x的下标,j表示数组y的下标 //B[i][j] o表示删除x的末尾一位,1表示删除末尾一位,2表示删除x,y数组末尾两位 int i, j;...

weixin_43988035的博客 163

算法分析与设计实践(作业九):最长公共子序列

<未完待续>

Hayleyzhou的博客 295

三机九节点暂态稳定性仿真程序:电力系统稳定性分析的利器

三机九节点暂态稳定性仿真程序:电力系统稳定性分析的利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在电力系统的稳定性分析领域,三机九节点暂态稳定性仿真程序(以下简称“三机九节点”)是一个极具价值的开源工具。该程序由王锡凡版开发,专注于模拟电力系统在暂态过程中的稳定性表现,帮助研究人员深入理解电力系统在扰动下的动态行为。 项目技术分析 三机九节点仿真程序采用成熟的数...

gitblog_06783的博客 339

AK8963磁强计配合九轴姿态解算精准度分析

本文深入分析AK8963磁强计在九轴姿态解算中的作用,探讨其高精度特性及易受硬铁、软铁干扰等问题,强调磁场校准与动态融合算法的重要性,揭示如何通过软硬件协同提升航向稳定性。

weixin_42284380的博客 407
上一篇: 算法设计与分析(八)
下一篇: 算法设计与分析(十)
Maple_Lai
博客等级 码龄10年 2粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值