算法模版
文章平均质量分 69
xtf__moji
这个作者很懒,什么都没留下…
展开
-
数据结构 List包含Map
List<Map<String, String>>,这种数据结构非常有用。Map<String, String>,可以取代类,有时候一些比较杂乱的元素组合到一起,不需要定义类,使用Map即可。使用List则返回该类型的一系列元素。Map map = new HashMap();map.put("key1", "value1");map.p...原创 2019-10-21 18:57:39 · 785 阅读 · 0 评论 -
算法总结
<br />算法策略的总结 <br />策略是面向问题的,算法是面向实现的。<br />一、不同算法策略特点小结<br />1、贪心策略<br /> 贪心策略一方面是求解过程比较简单的算法,另一方面它又是对能适用问题的条件要求最严格(即适用范围很小)的算法。<br /> 贪心策略解决问题是按一定顺序,在只考虑当前局部信息的情况下,就做出一定的决策,最终得出问题的解。<br /> 即:通过局部最优决策能得到全局最优决策<br />2、递推策略<br /> 递推也是由当前问题的逐步解决从而原创 2010-08-28 21:03:00 · 1128 阅读 · 0 评论 -
多重背包模版
#define max_n 101#define max_m 100001#define MAX(x,y) (x > y ? x : y)int c[max_n];int w[max_n];int n[max_n];int f[max_m];int V;void ZeroOnePack(int c,int w){ for(int v = V;v >= c;v--) f[v] = MAX(f[v],f[v - c] + w);}void Compl原创 2010-08-27 22:57:00 · 751 阅读 · 0 评论 -
贪心法
<br />贪心算法贪心算法<br />一、基本概念:<br /> 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。<br /> 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会<br />影响以前的状态,只与当前状态有关。<br /> 所以对所采用的贪心策略一定要仔细分析原创 2010-08-28 20:43:00 · 1272 阅读 · 0 评论 -
回溯法总结
<br />//递归方法实现回溯法void backtrack(int t){ //搜索解空间树第t层子树 //搜索到叶子节点 if(t > n) output(x); else //f(n,t)--当前扩展节点处未搜索过的子树的起始编号 //g(n,t)--当前扩展节点处为搜索过的子树的终止编号 for(int i = f(n,t);i <= g(n,t);i++){ //h(i)在当前扩展节点处x[t]的第i个可选值 x[t] = h(i);原创 2010-09-03 11:02:00 · 1059 阅读 · 0 评论 -
快速排序算法
<br />/*快速排序基本思想:将待排序记录分割成两部分,其中一部分记录的关键字都不大于另外一部分记录的关键字,然后再递归的对这两部分进行快速排序.*/#include<iostream>using namespace std;void swap(int &a,int &b){ int c = a; a = b; b = c;}int Partition(int L[],int low,int high){ //快速排序是一种原创 2010-09-18 22:40:00 · 666 阅读 · 0 评论 -
递归与数学归纳法
<br /> 递归是程序设计中常用到的一种简单易懂的方法,在很多场合下,利用递归可以大量减少代码量。<br /><br /> 递归往往能体现设计者头脑的聪慧,简单的递归函数省去了大段大段的代码,让人叹服不已。那么,递归的设计又有怎样的固定思路呢?本文将介绍递归与数学归纳法之间的联系,希望给读者一些启迪。<br /><br /> 数学归纳法是数学中重要的一种证明方法。当证明一个数学定理时,采用数学归纳法的思路是,先证明对于简单的可以代入的数,定理成立;再在假设定理对某一数N成立的前提下,证明原创 2010-09-04 23:25:00 · 5755 阅读 · 2 评论 -
层次结构打印二叉树
<br />#include <stdio.h>#include <stdlib.h>struct TreeNode{ int val; TreeNode *left,*right;};//左子树的节点小于等于根节点,右子树的节点大于等于根节点TreeNode* InsertTree(TreeNode *root,int val){ TreeNode *node; if(NULL == root) { node = (TreeNode *)m原创 2010-09-23 23:08:00 · 1469 阅读 · 0 评论 -
平衡二叉树
<br />#include <stdio.h>#include <stdlib.h>struct BTreeNode{ int val; int depth; BTreeNode *left,*right;};void ComputeDepth(BTreeNode *root){ //计算左右子树的最大深度 int depth; if(root->left) depth = root->left->depth; else depth原创 2010-09-24 01:46:00 · 676 阅读 · 0 评论 -
动态规划
动态规划算法一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就原创 2010-08-28 20:30:00 · 773 阅读 · 0 评论 -
分治法
<br />分治算法<br />一、基本概念<br /> 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以<br />简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……<br /> 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的原创 2010-08-28 20:05:00 · 927 阅读 · 0 评论 -
并查集的简单使用 pku 1611 The Suspects
<br />题目链接:<br />http://acm.pku.edu.cn/JudgeOnline/problem?id=1611<br /> <br />#include <stdio.h>#define MAX_STUDENT 30000int parent[MAX_STUDENT];int num[MAX_STUDENT];void make_set(int x){ parent[x] = x; num[x] = 1;}int find_set(int原创 2010-08-21 17:25:00 · 659 阅读 · 0 评论 -
并查集
<br />并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数、最小公共祖先、带<br />限制的作业排序,还有最完美的应用:实现Kruskar算法求最小生成树。其实,这一部分《算法导论》讲的很精炼。 <br /> 一般采取树形结构来存储并查集,在合并操作时可以利用树的节点数(加权规则)或者利用一个rank数组来存储集合的深度下界--启发式函数,在查找操作时进行路径压缩原创 2010-08-20 15:30:00 · 901 阅读 · 0 评论 -
二分图最大匹配 最大增广路径 递归法
<br />二分图的最大匹配<br />增广路径法 递归实现<br /> <br />//分别定义左右最大元素数量<br />#define Left_Max 101<br />#define Right_Max 301<br /><br />//匹配标志!!!!!在DFS遍历中寻找增广路径的时候用,每次在寻找增广路径的时候都要刷新<br />bool visit[Right_Max];<br />//记录对应在左边集合中的元素!!!这个是不要的<br />int link[Right_Max];<br /原创 2010-08-23 22:53:00 · 2586 阅读 · 0 评论 -
ACM常用算法与对应习题
<br />ACM常用算法及其相应的练习题2010年07月21日 星期三 01:56OJ上的一些水题(可用来练手和增加自信) <br />(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)<br />初期: <br />一.基本算法: <br /> (1)枚举. (poj1753,poj2965) <br /> (2)贪心(poj1328,poj2109,poj2586) <br /> (原创 2010-08-20 15:37:00 · 1067 阅读 · 0 评论 -
Trie Tree
<br />#include<iostream><br />#include<cstring><br />#define N 300 //有N个单词<br />#define M 1000000//有M次查询<br />#define kind 26//26个英文字母<br />using namespace std;<br />struct Treenode<br />{<br /> int count;<br /> Treenode *next[kind];<br /> Treenod原创 2010-08-20 15:07:00 · 562 阅读 · 0 评论 -
最大流的最短增益路径模版
<br />#define MAX 201<br />#define Inf 1<<20<br />#defineMIN(x,y)((x)<(y)?(x):(y))<br /> <br /> <br />//-------------------------------------------------------<br />//总结:利用队列进行广度探索,标记每个点的父结点和可再容纳的最大流量,<br />//探测到汇点时,汇点的可再容纳流量即是增益的流量,<br />//反复进行,直到不能探测到汇点为原创 2010-08-23 19:35:00 · 2369 阅读 · 0 评论 -
回溯法
回溯法1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。2、基本思想 在包含问题的所有解的解空间树中,按照深度原创 2010-08-28 19:36:00 · 1054 阅读 · 0 评论 -
分支界限法
<br />分支限界法<br />一、基本描述<br /> 类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求<br />解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。<br /> (1)分支搜索算法<br /> 所谓“分支”就是采用广度优先的策略,依次搜索E-结点的所有分支,也就是所有相邻结原创 2010-08-28 20:58:00 · 6280 阅读 · 0 评论 -
大数加法
<br />string plus(string a,string b) //参数是:字串下标的低位记录数值的高位<br />{<br /> string ans;<br /> int i,up=0; //up是进位值<br /> if(a.size()>b.size()) //用0补充较短的字串<br /> b=string(a.size()-b.size(),'0')+b;<br /> else if(a.size()<b.size())<br /> a=string(b.si原创 2010-08-19 21:12:00 · 472 阅读 · 0 评论