随笔分类 - 算法
摘要:描述 对于有根树T的两个节点u和v,最近公共祖先LCA(T,u,v)表示一个节点x满足x是u,v的公共祖先且x的深度尽可能大。 算法 求解LCA问题主要有三种解法,分别是暴力搜索,Tanjar算法,最后一种是转化为RMQ问题,用DFS+ST算法来求解 暴力搜索 暴力搜索 如果数据量不大的时候可以采用
阅读全文
摘要:0-1部分和问题描述:有n个大小不同的数字a,判断是否能从中取出若干个数,使得这些数的和为k。解决思路:利用DFS(深度优先搜索)来解决,用dfs(i,j)表示前i个数字能否得到部分和j,则根据前i+1个数的能否得到部分和j或j+a[i+1]来判断dfs(i,j)的状态,算法如下:1 bool df...
阅读全文
摘要:0-1背包题目描述:有n件物品和一个容量为v的背包,每件物品只有一个,第i件物品的重量为c[i],价值为w[i],求解将哪些物品放入背包中,是得这些物品的总重量不超过v且总价值最大。基本思路:利用动态规划来解决此问题,用f[i][v]表示前i件物品恰好放入一个容量为v的背包中所获得的价值,对于物品i...
阅读全文
摘要:dijkstra算法 基本思想:某最短路径上的点与源点之间的最短路径必然也在改最短路径之上,采用贪心策略,每次选取当前最短路径即可。 1 void dijkstra(int n) 2 { 3 int num=1,i; 4 int min,pos; 5 vis[n]=1;...
阅读全文
摘要:prim算法 基本思想:先从无向图中标记若干顶点,再从标记顶点中选择权值最小的边,且这条边的另一顶点未被标记,直到所有的点都已被标记。 算法实现:用数组vis表示点的标记情况,数组low表示与点关联的最小权值情况。 1 int prim(int n) 2 { 3 int i,...
阅读全文
摘要:最大公约数 1 int gcd(int a,int b) 2 { 3 int temp; 4 while(b) 5 { 6 temp = b; 7 b = a%b; 8 a = b; 9 }10 11 retu...
阅读全文
摘要:最近算法课又学习了一遍动态规划,看了一些求子序列的问题,特意集中mark一下以作备忘.。最长上升子序列问题描述 对于给定的整数数组序列,若它的一个子序列的元素是升序排列的,则称这个子序列是一个上升子序列。问题要求对于一给定整数数组,要求找到一个它的最长上升子序列。算法实现 设A为给定的数组,...
阅读全文

浙公网安备 33010602011771号