算法设计与分析
文章平均质量分 61
蛮力、分治、动态规划等常见算法
NLP菜鸟
这个作者很懒,什么都没留下…
展开
-
leetcode-跳跃游戏系列
1. 跳跃游戏leetcode 55.跳跃游戏1. 问题描述给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下原创 2022-08-09 09:14:24 · 2683 阅读 · 0 评论 -
2.6 动态规划—lc炒股系列
1. 买卖股票的最佳时机 I1. 问题描述给定一个数组 pricespricesprices,它的第 iii 个元素 prices[i]prices[i]prices[i] 表示一支给定股票第 iii 天的价格。你只能选择某一天买入这这支股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,原创 2022-08-09 09:14:01 · 177 阅读 · 0 评论 -
leetcode-5. 最长回文子串
1. 问题描述2. 题解1. 解法一:动态规划1. 算法思路对于一个子串而言,如果它是回文串,并且长度大于2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是 “a”。根据这样的思路,我们就可以用动态规划的方法解决本题。我们用P(i,j)P(i,j)P(i,j)表示字符串 sss 的第 iii 到 jjj 个字母组成的串(下文表示成 s[i:j]s[i:j]s[原创 2022-08-09 09:13:43 · 141 阅读 · 0 评论 -
2.5 动态规划—最长公共子序列
1. 问题描述给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少2. 代码实现1. 问题分析2. 代码实现#include<iostream>using namespace std;const int N = 1010;int n, m;char a[N], b[N];int f[N][N];int main(){ cin >> n >> m >> a + 1 &g原创 2022-08-09 09:13:24 · 107 阅读 · 0 评论 -
2.4动态规划—石子合并问题
1. 问题描述设有 N 堆石子排成一排,其编号为 1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有 4 堆石子分别为 1 3 5 2, 我们可以先合并 1、2 堆,代价为 4,得到 4 5 2, 又合并 1,2 堆,代价为 9,得到 9 2 ,再合并得到 11,总代价为 4+9+11=24;如果第二步原创 2022-08-09 09:13:05 · 4502 阅读 · 0 评论 -
3.2 回溯法—全排列
1. 问题描述给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3:输入:nums = [1]输出:[[1]]2. 问题分析class Solution { //使用一个动态数组保存所有可能的全排列原创 2022-03-17 09:04:05 · 1012 阅读 · 1 评论 -
2.3 动态规划—完全背包问题
1. 问题描述有NNN种物品和一个容量是VVV的背包,每种物品都有无限件可用。第iii种物品的体积是viv_ivi,价值是wiw_iwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。2. 代码实现1. 二维朴素写法#include<stdio.h>#include<math.h>#define N 1010int n, m; //n为物品个数,m为背包总容量int v[N], w[N]; //分别表示体积和重量原创 2022-02-26 10:51:44 · 1120 阅读 · 0 评论 -
2.2动态规划—0/1背包问题
1. 问题描述有NNN件物品和一个容量是VVV的背包,每件物品只能使用一次,第iii件物品的体积是viv_ivi,价值是wiw_iwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。2. 代码实现1. 问题分析闫氏分析法2. 二维朴素写法#include<stdio.h>#include<math.h>#define N 1010int n, m; //n为物品个数,m为背包总容量int v[N], w[N];原创 2022-02-26 10:18:34 · 431 阅读 · 0 评论 -
KMP算法代码详解
1. 问题描述从一个主串中找出你想要的子串。以下均以主串=ababacabaaa,模式串=abaaa为例2. 算法介绍求解该问题,比较容易想到的一种方法就是暴力解法,将模式串与主串逐个比较。但是,这种解法的缺陷就是效率太低,会产生很多不必要的比较过程。这时人们就提出了KMP算法,即:构造一个next数组,通过next数组的值来确定模式串下一比较位置。这样虽然增大了空间复杂度,但是极大地提高了求解效率。3. 代码解释int* GetNext(char* ch, int length, int nex原创 2022-02-14 23:27:19 · 322 阅读 · 0 评论 -
2.2 动态规划—TSP问题
1. 问题描述2. 问题分析1. 证明TSP问题满足最优性原理(反证法)2. 求解过程(实例)3. 求解步骤3. 算法设计4. 算法分析原创 2022-02-14 23:26:41 · 385 阅读 · 0 评论 -
3.1 回溯法
1. 问题的解空间2. 设计思想3. 求解过程4. 算法描述5. 时空性能原创 2022-02-14 23:26:22 · 448 阅读 · 0 评论 -
5.3 贪心法—背包问题
1. 问题描述2. 问题分析3. 算法设计4. 算法分析5. 算法证明原创 2022-02-14 23:25:42 · 74 阅读 · 0 评论 -
5.2 贪心法—图着色
1. 问题描述2. 问题分析3. 算法设计4. 算法分析本算法需要试探k中颜色,每种颜色,需要对所有顶点进行冲突测试,假设无向图有n个顶点,算法的时间复杂度为O(kn)O(kn)O(kn)原创 2022-02-14 23:25:13 · 745 阅读 · 0 评论 -
5.1 贪心法
1. 概述1. 算法描述2. 设计思想使用贪心选择策略,把一个复杂的问题,分解为一系列较为简单的局部最优选择,每一步选择都是对当前解的一个扩展,直到获得问题的完整解3. 贪心法求解的问题特征最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质贪心选择性质:问题的全局最优解可以通过局部最优解得到,即存在要给最优解是以贪心选择开始的(1)假设问题的一个整体最优解(2)证明可以将这个整体最优解修改成从贪心选择开始,此时,原问题就简化成为一个相似的、规模较小的子原创 2022-02-07 16:16:52 · 705 阅读 · 0 评论 -
4.2 分支限界法—0/1背包问题
1. 问题描述2. 问题分析队列式分支限界法与优先队列式分支限界法搜索对比3. 算法设计#include<cstdlib>#include<iostream>#include<queue>#include<algorithm>using namespace std;//问题表示const int MAXN = 50;int n = 4, W = 10;int w[] = { 0, 4, 7, 5, 3 };原创 2022-02-07 14:47:09 · 1190 阅读 · 0 评论 -
4.1 分支限界法
1. 定义以广度优先的方式系统地搜索问题的解空间树且结合限界函数的方法2. 设计思想按广度优先策略搜索问题的解空间树,在搜索过程中,对待处理的结点根据限界函数估算目标函数的可能取值,从中选取使目标函数(当问题的可行解不止一个时,为了衡量这些可行解的优劣,通常给出一个函数进行评价,这个函数称为目标函数)取得极值(极大或极小)的结点优先进行广度优先搜索,从而不断调整搜索方向,以便尽快找到问题的解3. 分支限界法与回溯法的异同4. 设计步骤1. 确定解空间结构:定义问题的解空间,确定易于搜索的解空间原创 2022-02-07 14:46:21 · 406 阅读 · 0 评论 -
3.2 回溯法—N皇后问题
1. 问题描述在n×nn\times nn×n的棋盘上摆放nnn个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上2. 问题分析下以求解4皇后问题为例,分析4皇后问题的排列树以及回溯过程:搜索及回溯过程:解空间树:3. 算法设计1. 算法思想①用数组x[]存放皇后的位置,x[k]表示第k个皇后放置的位置②先在第一行放置第1个皇后,然后依2、3、…、n的次序放置其他皇后,当第n个皇后放置好后产生要给可行解(为得到所有解,还需要继续试探第n个皇后的下一个位置)③在试探第k(k原创 2022-02-02 15:01:19 · 9829 阅读 · 0 评论 -
2.1 动态规划
1. 定义动态规划法:把多阶段过程转化为一系列单阶段问题,利用个各阶段之间的关系,逐个求解,并从中找到最优决策序列2. 多阶段决策过程将所给问题的求解过程,恰当的分为若干相互联系的阶段,每一阶段的决策仅依赖于前一阶段的状态,由决策所采取的动作使状态发生转移,成为下一阶段决策的依据。从而,一个决策序列(策略)再不断变化的状态中产生,这个过程称为多阶段决策过程阶段变量:用于表示各阶段,如阶段变量k为1~5状态:描述决策过程当前特征的量sks_ksk表示第k个阶段实际取得的状态,如:sks_原创 2022-01-27 15:47:47 · 1968 阅读 · 0 评论 -
1.3. 分治法—最近点对问题
1. 问题描述给定平面S上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小2. 求解过程划分:将集合S分成两个大小基本相等的子集S1S_1S1和S2S_2S2求解子问题:递归地求解两个子问题合并问题的解(三种情况)组成S的最近点对的2个点都在S1S_1S1中组成S的最近点对的2个点都在S2S_2S2中组成S的最近点对的2个点分别在S1S_1S1和S2S_2S2中3. 算法思路预排序:把S中的点分别按x坐标值和y坐标值排序如果S中包含的点少原创 2022-01-26 18:38:33 · 5029 阅读 · 2 评论 -
2.3 动态规划—最长公共子序列问题
1. 问题描述2. 问题分析1. 满足最优性原理2. 求解步骤3. 实例3. 求解最长公共子序列(回溯法)1. 求解思路2. 算法设计3. 算法分析原创 2022-01-25 15:08:11 · 608 阅读 · 0 评论 -
1.2. 分治法—棋盘覆盖问题
1. 问题描述2. 求解思路① 当k=0时,如图(a),只有一个特殊方格;当k=1时,如图(b),©,(d),(e),有四种不同的棋盘② 当k较大时,可以利用分治法的思想,将棋盘从中间一分为四,为了将其划分为四个相同的子问题,可以在分界处给无特殊方格的三个子问题补充一个特殊方格(即补充一个三格骨牌),然后继续按上述规则对子问题进行划分,直到k=1时,问题解便很容易得出。3. 算法实现1. 数据结构设计棋盘:整型二维数组board[size][size],其中size=2k2^k2k子棋原创 2022-01-15 20:58:03 · 1249 阅读 · 0 评论 -
1.1. 分治法实例—芯片测试
1. 问题描述输入:n片芯片,其中好芯片至少比坏芯片多1片问题:设计一种测试方法,通过测试从n片芯片中挑出1片好芯片要求:使用最少的测试次数2. 解题思路1. 判定芯片A的好坏问题:给定芯片A,判定A的好坏方法:用其余n-1片芯片对A测试2. 蛮力算法算法思想:任取1片测试,如果是好芯片,则测试结束;如果是坏芯片,则抛弃,再从剩下芯片中任取1片测试,直到得到1片好芯片时间估计:O(n2n^2n2)若第1片为坏芯片,则最多测试n-2次若第2片为坏芯片,则最多测试n-3次;原创 2022-01-12 20:31:09 · 1771 阅读 · 1 评论