算法--动态规划
动态规划(Dynamic Programming, DP)是一种算法设计技巧,用于解决具有重叠子问题和最优子结构性质的问题。通过将原问题分解为相对简单的子问题的方式来求解复杂问题,动态规划避免了计算重复子问题,从而提高了算法的效率。
动态规划的关键特点包括:
- 重叠子问题:在求解过程中,相同的子问题会被多次计算。动态规划通过存储这些子问题的解(通常是在一个表格中),每个子问题只解决一次,以避免不必要的计算。
- 最优子结构:一个问题的最优解包含其子问题的最优解。这意味着可以通过组合子问题的最优解来构造原问题的最优解。
- 状态转移方程:动态规划算法的核心,它描述了问题的状态如何从一个状态转移到另一个状态。状态转移方程通常取决于当前决策和相应的子问题解。
动态规划的步骤通常包括:
- 定义状态:确定问题的状态,以及状态之间的关系。
- 确定状态转移方程:找出状态之间如何转移的规则。
- 初始化条件:确定初始状态的值。
- 计算顺序:确定计算状态的顺序,确保在计算当前状态时,所需的子状态已经计算过。
- 构造最优解:根据计算出的状态值,构造问题的最优解。
动态规划广泛应用于各种领域,包括但不限于:
- 最短路径问题:如Dijkstra算法和Floyd-Warshall算法。
- 序列对齐问题:如生物信息学中的序列对齐。
- 资源分配问题:如背包问题。
- 字符串编辑距离:如计算两个字符串之间的最小编辑距离。
- 最长公共子序列:找出两个序列共有的最长子序列。
动态规划是解决优化问题的强大工具,但它要求问题具有重叠子问题和最优子结构的特性。正确识别和定义这些特性是应用动态规划成功的关键。
0-1背包问题
0-1背包问题是动态规划中的经典问题。给定一组物品,每种物品都有自己的重量和价值,在限定的总重量内,选择其中若干个(也即每种物品可以选择0个或1个),设计选择方案使得物品的总价值最高。
以下是使用动态规划解决0-1背包问题的C语言实现:
#include <stdio.h>
#include <stdlib.h>// 返回两个整数中的最大值
int max(int a, int b) {return (a > b) ? a : b;
}// 动态规划解决0-1背包问题
// 参数:W为背包最大容量,wt为物品重量数组,val为物品价值数组,n为物品数量
int knapSack(int W, int wt[], int val[], int n) {int i, w;// 创建一个二维数组dp,其中dp[i][w]表示在前i个物品中,能够装入容量为w的背包中的最大价值int **dp = (int **)malloc((n + 1) * sizeof(int *));for (i = 0; i <= n; i++) {dp[i] = (int *)malloc((W + 1) * sizeof(int));}// 填充表格for (i = 0; i <= n; i++) {for (w = 0; w <= W; w++) {if (i == 0 || w == 0)dp[i][w] = 0;else if (wt[i - 1] <= w)dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w]);elsedp[i][w] = dp[i - 1][w];}}// 存储结果int result = dp[n][W];// 释放dp数组for (i = 0; i <= n; i++) {free(dp[i]);}free(dp);return result;
}// 测试代码
int main() {int val[] = {60, 100, 120};int wt[] = {10, 20, 30};int W = 50;int n = sizeof(val) / sizeof(val[0]);printf("背包中物品的最大价值为:%d", knapSack(W, wt, val, n));return 0;
}
这段代码首先定义了一个max函数,用于返回两个整数中的最大值。knapSack函数是动态规划解决0-1背包问题的核心,它创建了一个二维数组dp,其中dp[i][w]表示在前i个物品中,能够装入容量为w的背包中的最大价值。通过填充这个表格,最终在dp[n][W]中得到了在给定物品和背包容量限制下的最大价值。最后,函数释放了dp数组所占用的内存,并返回了最大价值结果。
最长公共子序列问题
最长公共子序列(Longest Common Subsequence, LCS)问题是寻找两个序列共有的最长子序列的长度,这个子序列不需要在原序列中是连续的。以下是使用动态规划解决最长公共子序列问题的C语言实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 返回两个整数中的最大值
int max(int a, int b) {return (a > b) ? a : b;
}// 动态规划解决LCS问题
int lcs(char *X, char *Y, int m, int n) {int L[m+1][n+1];int i, j;// 构建L[m+1][n+1],以便保存LCS的长度for (i = 0; i <= m; i++) {for (j = 0; j <= n; j++) {if (i == 0 || j == 0)L[i][j] = 0;else if (X[i-1] == Y[j-1])L[i][j] = L[i-1][j-1] + 1;elseL[i][j] = max(L[i-1][j], L[i][j-1]);}}// L[m][n]包含了X[0..m-1]和Y[0..n-1]的LCS的长度return L[m][n];
}// 打印LCS,这是一个辅助函数
void printLCS(char *X, char *Y, int m, int n) {int index = lcs(X, Y, m, n);char lcs[index+1];lcs[index] = '\0'; // 设置字符串的终止符int i = m, j = n;while (i > 0 && j > 0) {if (X[i-1] == Y[j-1]) {lcs[index-1] = X[i-1]; // 如果当前字符在LCS中i--; j--; index--; // 减少值}else if (L[i-1][j] > L[i][j-1])i--;elsej--;}// 打印LCSprintf("LCS of %s and %s is %s\n", X, Y, lcs);
}// 测试代码
int main() {char X[] = "AGGTAB";char Y[] = "GXTXAYB";int m = strlen(X);int n = strlen(Y);printf("Length of LCS is %d\n", lcs(X, Y, m, n));// 如果需要打印LCS,取消注释下面的行// printLCS(X, Y, m, n);return 0;
}
这段代码首先定义了一个max函数,用于返回两个整数中的最大值。lcs函数是动态规划解决LCS问题的核心,它创建了一个二维数组L,其中L[i][j]表示字符串X[0…i-1]和Y[0…j-1]的LCS的长度。通过填充这个表格,最终在L[m][n]中得到了两个字符串的LCS的长度。
请注意,上述代码中的printLCS函数用于打印LCS,但由于它依赖于L数组,而L数组在lcs函数中是局部变量,直接使用printLCS函数可能会导致编译错误。为了使printLCS函数正常工作,需要对代码进行适当的修改,以便能够访问或重新计算L数组的值。这里提供的printLCS函数主要是为了展示如何根据L数组回溯找到LCS,实际使用时需要注意这一点。
相关文章:
算法--动态规划
动态规划(Dynamic Programming, DP)是一种算法设计技巧,用于解决具有重叠子问题和最优子结构性质的问题。通过将原问题分解为相对简单的子问题的方式来求解复杂问题,动态规划避免了计算重复子问题,从而提高了算法的效率…...
Python基础详解一
一,print打印 print("hello word") print(hello word) 双引号和单引号都可以 二,数据类型 Python中常用的有6种值的类型 输出类型信息 print(type(11)) print(type("22")) print(type(22.2)) <class int> <class str&…...
3.SpringSecurity基本原理
SpringSecurity本质是一个过滤器链。十多个过滤器构成一个过滤器链。 这些过滤器在项目启动就会进行加载。每个过滤器执行放行操作才会执行下一个过滤器。 常见过滤器 FilterSecurityInterceptor 是一个方法级的权限过滤器,基本位于过滤器链的最底部。 Excepti…...
Cesium--加载天地图
背景:vue-admin-temlate cesium 天地图 天地图地址:国家地理信息公共服务平台 天地图 步骤一:申请成为天地图开发者,创建应用 1,天地图使用方法(点击开发资源即可看到此页面) 2,点击控制台-登录账号 …...
2024蓝桥杯CTF writeUP--packet
根据流量分析,我们可以知道129是攻击机,128被留了php后门,129通过get请求来获得数据 129请求ls Respons在这 里面有flag文件 这里请求打开flag文件,并以base64编码流传输回来 获得flag的base64的数据 然后解码 到手...
C++容器——deque
deque容器 定义:动态数组,是一种双向开口的线性容器,意味着你不仅可以像在普通队列的末尾添加和移除元素,还可以在前端执行这些操作。 与其他容器相比不同的点: 与vector的主要区别: 连续性:…...
docker-compose安装es+kibana 8.12.2
小伙伴们,你们好,我是老寇,我又回来辣,几个月不见甚是想念啊!!! 因云平台需要改造,es7升级为es8,所以记录一下,es8需要开启ssl认证,需要配置证书…...
websevere服务器从零搭建到上线(二)|Linux上的五种IO模型
文章目录 阻塞 blocking非阻塞 non-blockingIO复用 IO multiplexing信号驱动 signal-driven异步 asynchronous拓展知识 看过上篇文章英国基本能理解本文五张图的内容websevere服务器从零搭建到上线(一)|阻塞、非阻塞、同步、异步 本文要能够在…...
STM32外设编程指南:GPIO、UART、SPI和I2C
STM32外设编程是嵌入式系统开发中的重要组成部分。以下是对STM32中GPIO(通用输入输出)、UART(通用异步接收传输器)、SPI(串行外设接口)和I2C(互连集成电路)等常见外设的编程指南&…...
git对远程和本地分支进行重命名
要同时对Git的远程和本地分支进行重命名,你需要分几个步骤操作: 重命名本地分支 切换到其他分支:在重命名当前分支之前,确保你不在你想要重命名的那个分支上。你可以通过以下命令切换到另一个分支(比如切换到master分…...
if 语句逻辑判断顺序
C 里面写if语句的时候是按照书写顺序来判断的,不好意思我之前没有考虑过这个问题; 如if(path.back nums[i] && !path.empty()),当path为空时,就会报错,因为编译器先判断的前面的path.back nums[i]࿰…...
第IV章-Ⅱ Vue3中的插槽使用
第IV章-Ⅱ Vue3中的插槽使用 基本插槽默认内容 具名插槽作用域插槽 在 Vue 3 中,插槽(slots)是一种强大的模式,用于将模板代码从父组件注入到子组件中,使得子组件的内容可以在使用时被自定义。Vue 3 中的插槽用法包括基…...
【半个月我拿下了软考证】软件设计师高频考点--系统化教学-网络安全
👨💻 收录于专栏:软件设计师考点暴击 ⭐🅰️进入狂砍分⭐ ⭐软件设计师高频考点文档, ⭐软件设计师高频考点专栏 ⭐软件设计师高频考点⭐ 🎶(A) 考点1,网络攻击 理解记忆 &#…...
E2PROM读写函数
void EEP_write(u8 add,u8 date) {I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CSendByte(date);I2CWaitAck();I2CStop();HAL_Delay(5); }这段代码是一个用于向一个I2C设备写入数据的函数。 函数定义: void EEP_write(u8 add,u8 data)这定义…...
MySql中什么是回表? 如何减少回表的次数
背景 在InnerDB中, B数的叶子节点存储数据的索引是聚集索引,也就是我们说的主键索引,而B数的叶子节点存储主键索引的是非聚集索引,也就是其他的索引 普通索引 唯一索引 组合索引,也就是非主键索引,在InnerD…...
【Linux】目录和文件相关的命令,补充:centos7系统目录结构
【Linux】Linux操作系统的设计理念之一就是“一切皆文件”(Everything is a file),即将设备、文件等都当作“文件”处理。 “文件”主要类型有:目录(即文件夹),链接文档(即快捷方式…...
【读点论文】SAM-LIGHTENING: A LIGHTWEIGHT SEGMENT ANYTHING MODEL,改进自注意力机制,然后知识蒸馏提点
SAM-LIGHTENING: A LIGHTWEIGHT SEGMENT ANYTHING MODEL WITH DILATED FLASH ATTENTION TO ACHIEVE 30 ACCELERATION ABSTRACT 分割任意模型(SAM)由于其零样本泛化能力,在分割任务中引起了广泛的关注。然而,SAM在现实世界实践中…...
PostgreSQL函数和运算符
PostgreSQL为内置的数据类型提供了大量的函数和运算符,用户也可以定义自己的函数和运算符,使用psql命令\df和\do可以列出所有可用的函数和运算符 1. 逻辑运算符 常用的逻辑运算符有AND、OR、NOT,逻辑系统有三个值true、fase和nullÿ…...
使用网络工具监控网络性能
网络工具和实用程序有助于有效地检测网络问题,诊断其原因和位置,以及缓解和解决问题,这有助于确保网络环境的稳定性,使用户免受设备连接问题带来的麻烦。 网络工具已经成为每个网络管理员用于有效诊断和处理网络问题的解决方案中…...
Gradle基础笔记
配置镜像 修改 gradle>wrapper>gradle-wrapper.properties distributionUrlhttps://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.6-all.zip 配置父项目 使用 subprojects 编码问题处理 [compileJava, compileTestJava, javadoc].options.encoding ‘UTF-…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
