- 博客(7)
- 资源 (8)
- 收藏
- 关注
原创 图的一些基本算法
#include #include using namespace std; #define MAXSIZE 100 #define INFINITY 65535 typedef char VertexType; typedef int EdgeType; /*用链表表示*/ typedef struct EdgeNode { int adjvex; EdgeType weight;
2014-03-10 21:36:50 434
原创 最长公共子序列(poj1458)
本题来自poj1458,题目大意:给定两个字符串X,Y,求X,Y的最长公共子序列,不要求子序列连续,但子序列在X,Y中的位置是严格单调递增的。 例如 abcfbc与abfcab的最长公共子序列就是abcd,其长度为4;programming和contest的最长公共子序列就是on,其长度为2;abcd和mnp的最长公共子序列为空 可以采用动态规划的方法来解该题,计算字符串A、B的最长公共子序列
2014-03-09 11:09:33 675 1
原创 poj1050-求二维数组子数组和的最大值
题意:给定一个二维数组,值有正有负,矩阵的规模不超过100*100,矩阵元素在-127到127之间,求该二维数组的一个子数组,使得该数组的元素之和在所有的子数组中是最大的。 解法一: 对整个矩阵进行枚举,采用四重循环,计算每个子矩阵的元素之和,在计算所有的子矩阵之和是有很多重复的计算,可以考虑用“空间换时间”的方法,先计算出以(1,1)为左上点,(i,j)为右下点所表示的矩阵元素之和为part
2014-03-07 21:52:14 1393
原创 poj2479-在一个数组中求任意不相交的两个子数组之和的最大值
该题的重点在于求一个数组中子数组之和的最大值,采用动态规划的方法求解,已知数组A[n] 假设已求得了A[i,n]中子数组之和的最大值,那么将A[i-1]加入进来后就出现了3种情况。A[i-1]就是A[i-1,n]中子数组之和的最大值A[i-1,...,j](iA[i-1]加进来后对子数组之和的最大值没有影响令A[i,n]子数组之和的最大值为nAll,以A[i]开头的,且是A[i,n]的子
2014-03-07 10:29:46 862
原创 寻找数组中的第k个数(序)
在上篇博客中寻找数组中的第k个数时每次排序所选择的pivot是随机选择的,在这篇博客中,我采用的是算法导论中讲的一种方法(算法导论上论证了该方法在最坏的情况下其运行时间都是线性的),尽可能使得划分后pivot两边数的个数差不多,具体步骤如下: 将数组中[low,high]之间的数以长度5为单位,分成1 + (high - low) / 5组("/"表示整数除)寻找每一组中的中位数,先将每
2014-03-06 19:54:28 504
原创 寻找数组中的第k个数
寻找数组中第k个最大的数跟快速排序的原理是类似的,快速排序的一次排序中是将数组的[i,j]段分为三部分[i,pivot-1],pivot,[pivot+1,j],那么pivot就是[i,j]中的第pivot-i+1个元素。那么把数组进行一次排序后,如果pivot就是第k个元素,则就达到了目的;如果pivot比k大,则表示第k大的元素在[i,pivot-1]中,因此现在就需要在[i,pivot-1]
2014-03-06 15:24:03 554
原创 快速排序
PartitionOne是一种常规的划分方法,使用low和high指针从数组的两端进行处理。 PartitionTwo是从low到high的方向进行处理,当数组部分有序时,[0-j]表示小于sentinel的元素,[j+1,i]表示大于sentinel的元素,当某个待处理的数小于sentinel时(下标为i+1),就将数组中j+1与i+1位置上的数互换,那么此时[0-j+1]就表示小于senti
2014-03-06 11:33:08 365
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人