算法
文章平均质量分 70
luojinping
这个作者很懒,什么都没留下…
展开
-
一些常用的算法集
1.冒泡#include void BubbleSort(int* pData,int Count){ int iTemp; for(int i=1;i { for(int j=Count-1;j>=i;转载 2011-10-14 11:45:48 · 789 阅读 · 0 评论 -
POJ2352——树状数组的应用
StarsTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 21050Accepted: 9172DescriptionAstronomers often examine starmaps where stars are represent原创 2012-05-20 22:08:15 · 838 阅读 · 0 评论 -
某公司面试题——怎样优化乘法?
某公司面试题——怎样优化乘法?要求算法尽量高效。#include using namespace std; //获得一个2的指数这个数的幂int getMi(int num){//不是2的指数则直接返回0if(num & (num -1) != 0)return 0;int times = 0;while (num >>= 1){times++;}r原创 2012-05-16 23:29:08 · 1619 阅读 · 0 评论 -
POJ-1150(求排列数P(n,m)中最后一个非0的数字)
1.如何求出n阶乘中质因数x(比如说5)出现的次数? int get(int m, int n)//计算n!中质因子m的出现次数 { if (n == 0) return 0; return (n / m) + get(m, n / m); } 解析:求n!中m出现的次数。那么n可以分解为即为求q的值。例如:假原创 2012-05-10 21:42:53 · 3062 阅读 · 1 评论 -
POJ1753——Flip Game
Flip GameTime Limit: 1000MS Memory Limit: 65536K Total Submissions: 4863 Accepted: 1983DescriptionFlip game is played on a rectangular 4x4 field with two-sided pieces placed on each of i转载 2011-12-13 11:17:17 · 3466 阅读 · 2 评论 -
最小生成树的prim算法
在无向加权图中,n个顶点的最小生成树有n-1条边,这些边使得n个顶点之间可达,且总的代价最小。prim算法是一种贪心算法,将全部的顶点划分为2个集合,每次总在2个集合之间中找最小的一条边,局部最优最终达到全局最优,这正是贪心的思想。具体的描述参见相关书籍:描述从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。1. 输入:一个加权连转载 2011-12-06 09:37:44 · 1380 阅读 · 0 评论 -
最小生成树的prim算法贪心正确性的证明
首先,一定有一个最优解包含了权值最小的边e_1(prim的第一步),因为如果不是这样,那么最优的解不包含e_1,把e_1加进去会形成一个环,任意去掉环里比e_1权值大的一条边,这样就构造了更优的一个解,矛盾用归纳法,假设prim的前k步选出来的边e_1,…, e_k是最优解的一部分,用类似的方法证明prim的方法选出的e_k+1 一定也能构造出最优解。转载 2011-12-06 10:31:39 · 11126 阅读 · 7 评论 -
最小生成树的kruskal算法
Kruskal算法思想 不同于Prim算法,Kruskal算法是一种按照连通网中边的权值的递增顺序构造最小生成树的算法。假设G=(V,E)是一个具有n个顶点的连通网,T=(U,TE)是G的最小生成树。Kruskal算法的基本思想是令集合U的初值为U=V,即包含有G中全部顶点,集合TE的初值为TE={}。然后,将图G中的边按权值从小到大的顺序依次选取,若选取的边使生成树T不形成回路,转载 2011-12-06 09:33:09 · 4234 阅读 · 0 评论 -
POJ1050 DP
To the MaxDescriptionGiven atwo-dimensional array of positive and negative integers, a sub-rectangle is anycontiguous sub-array of size 1*1 or greater located within the whole array. Thesum of a r原创 2011-11-05 20:01:54 · 1249 阅读 · 0 评论 -
动态规划的思想
动态规划的思想 动态规划( dynamic programming )算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强。利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题。动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它转载 2011-10-24 15:52:14 · 8593 阅读 · 1 评论 -
0-1背包问题的递归实现与非递归实现
题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是: 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必原创 2011-10-24 15:19:19 · 21482 阅读 · 10 评论 -
递归与非递归的比较
递归与非递归的比较非递归效率高;递归代码写出来思路清晰,可读性强。 生成可执行文件大小应该和编译器有关吧。。。。递归的话函数调用是有开销的,而且递归的次数受堆栈大小的限制。 以二叉树搜索为例: bool search(btree* p, int v) { if (null == p) return false; if (v == p->v转载 2011-10-24 15:09:14 · 13754 阅读 · 1 评论 -
一个解决数字螺旋排列的程序
题目:编程输出以下格式的数据: When i=0 1 When i=1 7 8 9 6 1 2 5 4 3 When i=2 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 1原创 2011-07-26 16:23:37 · 1151 阅读 · 0 评论