算法
文章平均质量分 82
Hui_NJ
11年多的C/C++研发经验
展开
-
DP(4)--区间DP
区间DP原创 2023-02-28 15:47:20 · 349 阅读 · 0 评论 -
DP(3)--背包DP(二维费用背包,分组背包,有依赖的背包)
dp原创 2023-02-24 15:20:47 · 351 阅读 · 0 评论 -
DP(2)--背包DP(0-1 背包,完全背包,多重背包,混合背包)
背包DP原创 2023-02-21 16:12:56 · 433 阅读 · 1 评论 -
DP(1)--记忆化搜索
动态规划理论与记忆化搜索原创 2023-02-09 13:48:22 · 336 阅读 · 0 评论 -
强连通分量 DFS 桥与割点 tarjan 算法
桥与割点原创 2022-11-02 16:57:03 · 336 阅读 · 0 评论 -
实数二分搜索
实数二分搜索原创 2022-10-27 16:46:17 · 231 阅读 · 0 评论 -
全排列与组合
全排列与组合原创 2022-09-13 15:10:30 · 228 阅读 · 0 评论 -
AVL 树
AVL Tree原创 2022-08-01 16:48:43 · 189 阅读 · 0 评论 -
递归与尾递归
递归:(1)每一级的函数调用都有自己的变量和返回。(2)递归函数中,位于递归调用前的语句和被调用函数具有相同的执行顺序,位于递归调用后的语句的执行顺序和被调用函数的顺序相反#include<stdio.h>void recursive(int n){ printf("Begin %d\n", n); if (n<4) recursive(n+1); printf("End %d\n", n);}int main()...原创 2022-05-27 16:09:13 · 363 阅读 · 0 评论 -
算法设计与分析基础学习笔记--第二章
汉诺塔问题 场景一: 有三根杆子A,B,C。A杆上有N个(N>=1)圆盘,盘的尺寸由下到上依次变小。 把A上的圆盘从下面开始按大小顺序重新摆放在C柱子上。并且规定,在小圆盘上不能放在大圆盘上,在三根柱子之间一回只能移动一个圆盘。 对于任意N,最少要移动多少次? 使用数学归纳法 当N为1时,需要1次 当N为2时,A-->B, A-->C, B-->C, 需要3次原创 2018-01-26 16:18:26 · 353 阅读 · 0 评论 -
算法设计与分析基础学习笔记--第一章
第一章欧几里德算法又称辗转相除法,用于计算两个整数a, b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)证明:(1)假设d是a,b的一个公约数,a可以表示成a = kb + r,则r = a % b,则有d|a, d|b, 而r = a - kb,故 d|r,因此d是原创 2018-01-16 15:57:10 · 326 阅读 · 0 评论 -
硬币问题
有1元,2元,5元面值的硬币若干枚,如何用最少的硬币凑出11元面值如果用最少的硬币凑出n元(n (1)当我们遇到一个大问题时,总是习惯把问题规模变小,这样便于分析(2)规模变小后的问题和原来的问题是相同性质的,本质上还是一个问题dp[n]: 最少需要多少个硬币来凑足n元那么dp[0] = 0dp[1] = 1, 凑足一元最少需要一个一元的硬币dp[2] = mi原创 2017-10-16 13:57:16 · 329 阅读 · 0 评论 -
链式前向星+拓扑排序+最短路径(Dijkstra+Floyd+Bellman-Ford+SPFA)
最短路径算法通常依赖于一个性质,一条两结点间的最短路径包含路径上的其他的最短路径。Dijkstra算法不允许图中存在负权边1.单源最短路径:从某点s到其他所有结点的最短路径2.松弛技术:松弛边(u,v),检测当前从s到v的最优路径是否有必要经过s到u,如有必要,则取边(u,v)G = (V,E) where V is a set of vertices and E is a...............原创 2014-07-09 14:18:51 · 1773 阅读 · 0 评论 -
最长公共子序列(Longest Common Subsequence, LCS)
某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置(在前或在后)而形成的新序列,所以子序列不必连续最长公共子序列的最优子结构性质设序列X=和Y=的一个最长公共子序列Z=, 则:(1) 若xm=yn, 则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;(2) 若xm≠yn且zk≠xm, 则Z是Xm-1和Y的最长公共子序列;(3) 若xm≠yn且原创 2014-09-16 14:57:09 · 531 阅读 · 0 评论 -
最长公共子串(Longest-Common-Substring)
使用dp[i][j]表示 以str1[i]和str2[j]结尾的最长公共子串的长度,因为要求子串连续,所以对于str1[i]与str2[j]来讲,它们要么与之前的公共子串构成新的公共子串;要么就是不构成公共子串。状态转移方程 1 str1[i] == str2[j] && (0 == i || 0 ==原创 2014-09-19 10:24:36 · 491 阅读 · 0 评论 -
最大流最小割---FordFulkerson
1网络流的基本概念 一、流网络:网络或容量网络指的是一个连通的赋权有向图 D= (V、E、C) , 其中V 是该图的顶点集,E是有向边(即弧)集,C是弧上的容量。此外顶点集中包括一个起点(源点)s和一个终点t(汇点)。网络上的流就是由起点流向终点的可行流,这是定义在网络上的非负函数,它一方面受到容量的限制,另一方面除去起点和终点以外,在所有中途点要求保持流入量和流出量是平衡的。原创 2014-08-05 12:38:39 · 1328 阅读 · 0 评论 -
最小生成树---Prim
Prim算法的特点是集合E中的边总是形成单棵树,树从任意根节点s开始形成,并逐渐生成,直至该树覆盖了V中的所有顶点。设图G =(V,E),其生成树的顶点集合为U。①.把v0放入U②.在所有u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树③.把②找到的边的v加入U集合。如果U集合已有n个元素,则结束,否则继续执行②Challenge: Find the m原创 2014-06-17 14:07:43 · 421 阅读 · 0 评论 -
Dynamic connectivity --Union-Find
refer to :http://algs4.cs.princeton.edu/15uf/test date:10 84 33 86 59 42 15 07 26 1/*discription: n nodes, k linked pairs, calculate total setssolution: set a same id for the翻译 2013-06-09 13:15:14 · 656 阅读 · 0 评论 -
中位数------求数组中第i小的元素
#include #include /* srand() , rand() */#include using std::cout;using std::endl;int randomized_partition(int arr[], int p, int r){ srand(time(NULL)); int key = ran原创 2013-07-29 13:25:16 · 532 阅读 · 0 评论 -
简单动态规划
动态规划问题必须同时具有如下二个要素:最优子结构 如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子结构。动态规划以自底向上的方式来利用最优子结构重叠子问题 子问题的空间要“很小”,也就是用来解原问题的递归算法可反复的解同样的子问题,而不是产生新的子问题。DP通过每个子问题只解一次,把解保存在一个需要时就可以查到的表中,每次查表的时间为常数。 装配线原创 2013-10-21 21:56:18 · 384 阅读 · 0 评论 -
模糊匹配
通配符* 可以代替0个或者多个字符;通配符? 可以代替一个字符#include using std::cout;using std::endl;bool wildcmp(const char *src, const char *input){ while('\0' != *src && '*' != *input) {原创 2013-11-18 09:36:44 · 486 阅读 · 0 评论 -
MM-Chess
There is an interesting game called MM-Chess. The size of the board is 1*N, every grid has a score (non-negative). The first grid is the start and the Nth grid is the end. The game requires players t原创 2013-12-10 21:47:23 · 410 阅读 · 0 评论 -
贪心算法之活动选择问题
1、活动选择问题描述 有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi,且 0≤sii。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,则称ai和aj两个活动是兼容的。该问题就是要找出一个由互相兼容的活动组成的最大子集。例如下图所原创 2013-12-31 17:07:23 · 715 阅读 · 0 评论 -
无向图基本操作
refer to http://algs4.cs.princeton.edu/41undirected/#include #include #include #include #include using std::vector;using std::stack;using std::queue;using std::cout;using翻译 2014-01-08 16:31:44 · 782 阅读 · 0 评论 -
线性排序----计数排序, 基数排序, 桶排序
/* 描述:计数排序,它要求待排序元素是位于0到len之间的正整数,主要适用于元素个数多,但是普遍不太大而且总小于len的情况*/#include using std::cout;using std::endl;void cnt_sort(unsigned int arr[], unsigned int ans[], int len){ unsig原创 2013-07-23 14:48:23 · 552 阅读 · 0 评论 -
排序----插入排序,二路归并排序,堆排序,快速排序
/*堆:若将序列所存储的arr[1,n]看做是一棵完全二叉树的存储结构,树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字堆排序:1.将要排序的数组创建为一个大根堆。大根堆的堆顶元素就是这个堆中最大的元素。2.将大根堆的堆顶元素和无序区最后一个元素交换,并将无序区最后一个位置加入有序区, 然后将新的无序区调整为大根堆。重复操作,无序区在递减,有序原创 2013-07-01 18:23:38 · 692 阅读 · 0 评论 -
霍夫曼编码
霍夫曼编码算法:按父节点频度的递增序排序最小优先队列的内容,合并具有最低频度数的两棵树为一棵新的二叉树,其父节点频度为其二个子节点的频度之和,重复此过程,直到得到最终的小根堆。#include #include #include #include #include #include using std::cout;using std::endl;us原创 2014-06-04 16:04:30 · 910 阅读 · 0 评论 -
有向无环图的单源最短路径----拓扑排序+松弛
算法开始对DAG图进行拓扑排序,以便获得结点的线性序列;当对线性序列进行处理时,松弛从该点出发的所有边。对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的利用DFS现实拓原创 2014-07-22 10:50:22 · 1026 阅读 · 0 评论 -
最小生成树-Kruskal
1.首先将G的n个顶点看成n个孤立的连通分支(n个孤立点)并将所有的边按权从小大排序2.裁取权值最小的边,如果加入此边后存在圈则这条边不加入,重复这个操作,直到加入n-1条边#include #include #include #include #include #include using std::list;using std::vector;using原创 2014-06-13 14:19:03 · 369 阅读 · 0 评论 -
单源最短路径---Bellman-Ford
Bellman-ford算法是求解连通带权图中单源最短路径的一种常用算法,它允许图中存在权值为负的边。同时它还能够判断出图中是否存在一个权值之和为负的回路。如果存在的话,图中就不存在最短路径。判断是否存在从源点可达的负权值回路的方法,在求出最终的distTo[]之后,在对每一条边判断一下,加入这条边是否会使得结点v的最短路径在缩短,即判断 distTo[u]+w(u,v)存在负权回原创 2014-07-23 15:58:43 · 590 阅读 · 0 评论 -
最长上升子序列
问题描述如下:A numeric sequence of ai is ordered if a1 the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK),where 1 ordered subsequences, e. g., (1, 7), (3, 4, 8)原创 2013-04-16 21:17:22 · 434 阅读 · 0 评论