随笔分类 - 算法
摘要:数组类:第一步:枚举,最简单暴力第二步:要对枚举进行优化,一般枚举的复杂度为O(n^2),则可以考虑排序,分治,因为他们的复杂度为O(nlogn),比枚举要优第三步:可选:可以考虑空间换时间,用哈希树:第一个思路:递归,如果想用非递归,可以用栈实现第二个思路:动态规划
阅读全文
摘要:二叉查找树又可以叫做二叉排序树,它是一颗空树或者是具有如下性质的二叉树:若它的左子树非空,则左子树上所有结点的值均小于根结点的值若它的右子树非空,则右子树上所有结点的值均大于根结点的值左、右子树本身又各是一棵二叉排序树POJ2418 http://poj.org/problem?id=2418 1 #include<iostream> 2 #include<iomanip> 3 using namespace std; 4 5 long total=1; 6 7 struct Node 8 { 9 char treename[35];10 int tree_num;1.
阅读全文
摘要:最长公共子串是动态规划的一种经典应用。设X = {x1,x2,...xm},Y = {y1,y2,..,yn}为两个序列,并设Z = {z1,z2,...,zk}为X和Y的任意一个LCS,那么有3种情况:如果xm = yn,那么zk=xm=yn 而且Zk-1是Xm-1和Yn-1的一个LCS。如果xm != yn,那么zk!=xm,蕴含Z是Xm-1和Y的一个LCS。如果xm != yn,那么zk!=yn,蕴含Z是X和Yn-1的一个LCS。POJ1458 http://poj.org/problem?id=1458题意:标题就叫做common subsequenceView Code 1 #in.
阅读全文
摘要:给定一个序列,要求求出该序列的最长单调子序列, 即 longest increasing subsequence,这是一个经典的动态规划求解问题。设给定序列为 a[],大小为 n,如何求其最长单调子序列呢?考虑将最长单调子序列的长度作为所求的最优值,最长单调子序列必定以序列a[]中的某一个元素结尾。设序列count[i]为以a[i]结尾的最长单调子序列的长度,那么a[]的LIS的长度就是max{count[i]}, 对所有i。显然此问题具有最优子结构性质,count[0] = 1, count[i] = max{count[j] | 0 <= j < i, a[j] < a[
阅读全文
摘要:动态规划与分治法一样,将问题的最优解切割成多个子问题的最优解;但与分治法不同的是,分治法要求各个子问题必须是相互独立的,而动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题。在这种情况下,若用分治法则会做许多不必要的工作,即重复的求解公共的子子问题。 采用动态规划时,由于有多个公共的子子问题,可以将各个子子问题的结果保留下来,避免重复计算。动态规划算法可以分为以下四步实现:描述最优解的结果递归定义最优解的值按自底向上的方式计算最优解的值由计算出的结果构造一个最优解1~3步构成问题的动态规划最优解的基础,第4步在只要计算最优解的值时可以略去。经典应用:01背包问题,最优二...
阅读全文
浙公网安备 33010602011771号