算法(C++描述)
文章平均质量分 73
幼小艺人
这个作者很懒,什么都没留下…
展开
-
最长上升子序列LIS O(nlgn)算法
问题就不描述了,相信来看这个算法的人都清楚。 int LIS(int str[],int len) { int max,left,right,i,mid; lis[1] = str[0]; max = 1; for(i=1; i<len; i++) { if(str[i] > lis[max]) {原创 2011-12-15 14:57:18 · 506 阅读 · 0 评论 -
大整数类C++实现——关键代码
相信很多编程新手都上google,baidu搜过这类东西。 我也是因为这样才终于下决心自己动手完善一个大整数类,虽然C++效率不如C,不过只是关键算法明白就好,写成类只是心理痛快点。 先看头文件代码: 基本的C++类什么的就不详细讲了,主要说一下设计思路。 #define MAXLEN 1000 #define POSITIVE 1 #define NEGATIVE -1 #原创 2011-08-06 22:59:17 · 4228 阅读 · 0 评论 -
最长公共子串LCS plus 空间复杂度优化版
最长公共子串(Longest common substring)问题指的是求出给定的一组字符串的长度最大的共有的子字符串。 举例说明,以下三个字符串的LCS就是 cde: (字符可以不相邻) asdf awsrdef asdff 这个算法很经典,就不解释了,不清楚的google一下吧,写日志就是为了记录下来。 先给出原始版:(函数返回所求的lcs,字符串和二维数组在全局定义)原创 2011-11-23 14:22:27 · 1724 阅读 · 0 评论 -
二分法矩阵求斐波那契(fibonacci)数列第n项
如图,Fibonacci 数列中任何一项可以用矩阵幂算出,而n次幂是可以在logn的时间内算出的。 下面贴出代码: void multiply(int c[2][2],int a[2][2],int b[2][2],int mod) { int tmp[4]; tmp[0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]; tmp[1]=a[0][0原创 2011-10-13 20:26:15 · 2145 阅读 · 1 评论 -
修改归并排序求逆序数
逆序指的是一列数中,如果a在b前面,且a>b,称ab逆序,逆序数是一列数中逆序对的个数。很直接的想法是用两层循环,不过我们有更快速的办法,利用归并排序。 归并排序的思路是把待排序的数组分为有序的两部分,例如1,3,5,7,9和2,4,6,8,10,再用O(n)的时间合并这两部分,待合并的子序列利用递归来排序,直到合并的序列为一两个数。 求逆序则是利用其中合并的一步,代码如下: templ原创 2011-10-13 20:54:29 · 704 阅读 · 0 评论 -
大整数类C++实现——完整代码
#include using std::ostream; #define MAXLEN 10001 #define POSITIVE 1 #define NEGATIVE -1 #define ZERO 0 class HugeInt { friend ostream& operator<<(ostream& output,const HugeInt& n); public:原创 2011-08-06 23:02:12 · 2467 阅读 · 4 评论 -
0-1背包算法 plus 空间复杂度优化版
问题描述:在M件物品取出若干件放在空间为W的背包里,每件物品的体积为volume[1],volume[2]……volume[n],与之相对应的价值为value[1],value[2]……value[n]。物品不可分割。 算法:动态规划。dp[i][j]表示有i件物品,背包大小为j的时候能拿走物品的最大价值,那么, dp[i][j]=max(dp[i-1][ j-volume[i] ]+原创 2011-12-15 19:08:29 · 942 阅读 · 1 评论 -
组合数算法-解决溢出问题
组合数的定义:C(n,m)=n!/( (n-m)!*m! ) 计算组合数主要头疼的是溢出,long long 类型的数字算C(82,41)已经不行了。。。 一、普通算法 由于溢出问题严重,所以算出三个阶乘再做除法的话,中间结果会溢出。 首先做个小优化,利用 C(n,m) = C(n,n-m) ,如果m超过n的一半就让 m = n-m。 这样处理之后,m一定是小于等原创 2011-11-05 14:45:33 · 5099 阅读 · 0 评论