
算法
文章平均质量分 97
探寻美妙的算法,在算法的世界里找寻本质的美
编程之美,趋之若鹜
从来无所求,所得皆惊喜。
展开
-
动态规划解决数字三角形
美图:问题描述: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 给定一个数字三角形,如上,在这个三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。求出这个最大和。一. 我们先考虑使用递归来解决。用二维数组D来存放数字三角形,问题转换如下:...原创 2020-03-18 16:21:30 · 7050 阅读 · 7 评论 -
动态规划解决最长公共子序列
什么是最长公共子序列? 1. 官方定义:最长公共子序列也称作最长公共子串(不要求连续,但要求次序),英文缩写为 LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。 2. 通俗的讲,就是给定两个字符串,求出这样一个最长的公共子序列的长...原创 2020-03-18 10:13:46 · 4335 阅读 · 5 评论 -
浅谈动态规划
何谓动态规划?简言之就是优化版的分治算法。优化的分治?什么鬼?动态规划的本质是分治算法,即:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。但是一般的分治算法会产生很多的冗余计算,如下图:可以看到,这里的F3,F2被多次计算,这就导致了算法的执行时间变长。我们是不是可以想到一个办法,用一个东西去保存已经计算出来的量,避免重复多次的计算。OK,这就...原创 2020-03-17 11:43:11 · 941 阅读 · 1 评论 -
超详细的动态规划解决矩阵连乘
动态规划解决矩阵连乘问题描述: 给定NNN个矩阵 {A1,A2,A3……An}\{A_1,A_2,A_3……A_n\}{A1,A2,A3……An},其中 AiA_{i}Ai 和 Ai+1A_{i+1}Ai+1 和可以相乘的,即: AiA_iAi 的行数等于 Ai+1A_{i+1}Ai+1 的列数,如何。确定矩阵连乘的计算次序,使得安照此次序计算该矩阵连乘所需要的数乘次数最少...原创 2020-03-21 21:23:15 · 11465 阅读 · 14 评论 -
N皇后问题
问题描述: N皇后问题是把N个皇后放到N∗NN*NN∗N的棋盘中,使它们不会相互攻击。根据国际象棋规定,皇后可以吃掉和它同行、同列或同一斜线上的任意一个棋子。设计算法给出所有解。如下图:如果一个皇后在图中的位置,那么,在她的行,列,对角线上都不能有其他皇后算法分析: 解决这个问题最简单粗暴的方法就是枚举,枚举所有的可能性,最后得出解,如:求 4 皇后问题时,我们可以直接使用 4 层...原创 2020-03-21 12:58:04 · 4296 阅读 · 13 评论 -
分治算法解决归并排序
分治算法问题引入: 前文说到,叶天帝集结天庭众人攻打生命禁区,在此之前发生了一个小插曲,大黑狗偷了叶天帝的空间戒指,使得叶天帝无法携带大量的资源。为此,叶天帝闭关九九八十一天,创出了 0-1背包大法 ,这才顺利启程,一场大战缓缓拉开帷幕。 这一日,叶天帝与众位黑暗至尊展开了白热化的战斗,叶天帝虽强,但终归是双拳难敌四手,战况岌岌可危,叶天帝险象环生。在这千钧一发之际,只见大黑狗施展“行...原创 2020-03-20 21:44:43 · 2223 阅读 · 5 评论 -
0-1背包问题
动态规划解决0/1背包问题什么是 0/1 背包问题,在我们计算机眼里中 0 就代表完全没有,1 就代表完全得到。所以,0/1 背包就是一件物品是否放入背包原创 2020-03-20 11:17:59 · 2661 阅读 · 12 评论 -
最长上升子序列
动态规划解决最长上升子序列问题描述: 给定一个任意顺序的数字序列,找出其中的最长上升子序列。给定一个数字序列AiA_iAi,它可以得到多个上升的子序列,不要求连续,但要求先后顺序,保证子序列后一个元素一定比前一个元素大。这些上升的子序列中的最长的一个,就是它的最长上升子序列。 如:给定数字序列为A={1,7,3,5,9,4,8},它的上升子序列有{1,7},{1,3},{1,3,5}...原创 2020-03-19 10:43:25 · 2259 阅读 · 6 评论 -
最短路径之SPFA算法(邻接矩阵+邻接表)
文章目录(一)SPFA算法1.1 邻接矩阵存图1.1.1 核心算法1.2 邻接表存图(一)SPFA算法【前言】:上一篇的Bellman_ford算法就可以解决求图中含有负权边时的最短路径,但我们可以看到Bellman_ford算法是一个三重循环,如果数据量大的话,它的效率非常低(当然,本来效率就低)。而SPFA算法就是对Bellman_ford算法的一个优化。SPFA算法的全称是:Shorte...原创 2019-05-31 09:32:09 · 1060 阅读 · 0 评论 -
最短路径之Bellman_ford算法(结构体存图)
#include<iostream>using namespace std;#define N 1000#define INF 0x3f3f3f3fint dis[N];struct node{ int a; int b; int v;}mp[N];bool Bellman_ford(int n){ int i, j, k; for (i = 1; i &l...原创 2019-05-29 19:21:05 · 310 阅读 · 1 评论 -
最短路径之Bellman_ford算法(邻接矩阵存图)
文章目录(一)Bellman_ford算法1.1 用邻接矩阵存图,并初始化1.2 初始化dis距离数组1.3 遍历所有结点,进行松弛操作1.4 检测是否含有负权回路(一)Bellman_ford算法【知识储备】:负权回路:在一个图里每条边都有一个权值(有正有负),如果存在一个环(从某个点出发又回到自己的路径),而且这个环上所有权值之和是负数,那这就是一个负权环,也叫负权回路。(好像也分有向图...原创 2019-05-29 18:14:24 · 1231 阅读 · 0 评论 -
最短路径之Flody算法(邻接矩阵存图)
文章目录(一) Flody算法(一) Flody算法【前言】:前面的Dijkstra算法用来解决单源最短路径的问题,即:从指定点到图上其他各点的最短路径。那么,如果我们要求图中任意两个结点之间的最短路径,如何用算法来实现呢?如果用Dijkstra来实现,就需要每次改变源点,再使用多个dis数组来记录,这样,问题就会变得很复杂。那么,有没有一种简单的算法来求图中任意两个结点之间的最短路径呢?当然...原创 2019-05-25 21:09:22 · 1395 阅读 · 1 评论 -
最小生成树之Prime算法(临接表+优先队列实现)
#include <iostream>#include <cstdio>#include <vector>#include <queue>#include<cstring>using namespace std;const int maxn = 105;const int inf = 0x3f3f3f3f;struct ...原创 2019-05-22 22:19:52 · 3095 阅读 · 0 评论 -
最短路径之Dijkstra算法(邻接矩阵实现)
文章目录(一)Dijkstra算法(一)Dijkstra算法单源最短路径:是从某一个顶点出发,到图中任意顶点之间的最短路径;【算法概述】:Dijkstra算法适用于解决单源最短路径的问题。但Dijkstra算法要求所有边的权值非负。看过Prime算法的同学都知道,Dijkstra算法与Prime算法很相似,不同的就是dis数组的更新方式。Dijkstra算法用邻接矩阵存图比较方便。#inc...原创 2019-05-21 20:48:27 · 9881 阅读 · 5 评论 -
最小生成树之Kruskal算法(优先队列实现)
文章目录(一) Kruskal算法(优先队列实现)(一) Kruskal算法(优先队列实现)由上一篇知道,Kruskal算法是对边的权值进行从小到大的排序,然后运用“加边法”实现;上一篇对边的权值进行排序的时候是用结构体自定义排序实现,当然,我们也可以用优先队列实现;【算法概述】:存图时依然用结构体,和上一篇基本差不多,只是在对边的权值排序的时候用到了优先队列(优先队列)的自定义排序。注:...原创 2019-05-21 17:00:06 · 1290 阅读 · 0 评论 -
最小生成树之kruskal算法(结构体实现)
文章目录(一)Kuskal算法1.1 存图方式1.2 并查集思想(重点)1.3 Kuskal算法主体(一)Kuskal算法【算法简介】:上一篇中的Prime算法是一种“加点式的算法”,而Kuskal算法是一种“加边式的算法”;Kuskal算法与Prime算法都是一种贪心算法,但Kruskal算法对图中存在相同权值的边时也有效。【算法思想】:算法对权值从小到大排序,每次选取当前权值最小的边加入...原创 2019-05-21 00:01:10 · 1352 阅读 · 0 评论 -
最小生成树之prime算法(邻接矩阵实现)
文章目录(一)prime算法1.1 使用邻接矩阵存图(一)prime算法1.1 使用邻接矩阵存图#include<iostream>#include<cstring>using namespace std;#define N 1000#define INF 0x3f3f3f3fint mp[N][N]; //使用邻接矩阵存图;int dis[N]; ...原创 2019-05-19 00:11:50 · 5243 阅读 · 3 评论 -
KMP算法
文章目录(一)KMP算法!!!1.1 next数组的计算1.2 KMP算法(一)KMP算法!!!【KMP算法】:Knuth-Morris-Pratt字符串查找算法,简称“KMP算法”,和上一篇“暴力匹配算法”得应用一样,用于在一个母串中查找一个子串出现的位置。KMP算法由Donald Knuth,James H.Morris,Vaughan Partt三人于1977年发布。故,称为“KMP算法...原创 2019-04-26 18:17:58 · 1056 阅读 · 2 评论 -
查找字符串位置之暴力匹配算法
大圣苦苦寻找紫霞仙子,,,,,(*)暴力匹配算法问题:有两个字符串,s1是母串,s2是子串,要在母串中找子串出现的位置。s1: SJHETCSAGYAs2: CS用暴力匹配思路就是:用s1[i]和s2[j]去匹配,如果匹配成功,i++,j++,即s1和s2都后移一位,匹配下一位;如果匹配失败,让i=i-j+1;j=0;即让s1后移一位,s2回溯,从s1的下一位重新匹配...原创 2019-04-26 10:38:50 · 564 阅读 · 0 评论 -
KMP算法总结
kmp算法总结#include<iostream>#include<string.h>using namespace std;int next1[1005];void getnext(char *s1, char *s2){ int len2 = strlen(s2); int i = 0, j = -1; next1[0] = -1; while (i...原创 2019-04-12 19:23:20 · 128 阅读 · 0 评论