
算法初步
文章平均质量分 69
weiyang_8765
不会讲段子的程序员不是好玩家
展开
-
串匹配 KMP
1. 前言 字符串匹配是一个经典算法问题,展开来讲各类问题多达几十种,有名称的算法也不下三十种,所以需要深入学习的东西有很多。这次我们来探讨一个最简单的问题,假设现在随机输入一个长度为m的主串T,另外输入一个长度为n(n≤m)的字符串P,我们来判断字符串P是否是主串T的一个子串(即能否从T中随机取出与P同长的一段字符串,与P完全匹配)。2. 蛮力匹配法 问题很简单,当然转载 2016-12-04 22:39:03 · 248 阅读 · 0 评论 -
单元最短路径问题 分支界限法
分支界限法类似于回溯法,也是在问题的解空间上搜索问题解的算法。回溯法以深度优先的方式搜索解空间,而分支界限法则以广度优先(队列式分支界限法)或者以最小消耗的方式(优先队列式分支界限法)搜索解空间。队列式分支界限法:队列式分支界限法将活结点表组织成一个队列,并按照队列的先进先出原则选取下一个结点为当前扩展结点。而且队列式分支界限法不搜索以不可行结点为根的子树。优先队列式分支界限法:优先队列式原创 2017-07-16 21:23:46 · 3629 阅读 · 0 评论 -
整数划分(递归)
将正整数n表示成一系列正整数之和n=n1+n2+......+nk例如对于正整数6: 6;5+1;4+2;4+1+1;3+3;3+2+1;3+1+1+1;2+2+2;2+2+1+1;2+1+1+1+1;1+1+1+1+1+1+1;所以对于正整数6有P(6)=11中划分在正整数n的所有不同划分中,将最大加数n1不大于m的划分个数记作q(n,m)。有原创 2017-06-30 12:43:40 · 805 阅读 · 0 评论 -
最大子段和问题的分治算法和动态规划算法
如果将所给的序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有三种情形:1)a[1:n]的最大子段和与a[1:n/2]的最大子段和相同;2)a[1:n]的最大子段和与a[n/2:n]的最大子段和相同;3)a[1:n]的最大子段和为Σ(k=i~j)ak,且1(1)(2)可递归求得。对于(3),容易看出a[n/原创 2017-07-04 14:52:01 · 3549 阅读 · 0 评论 -
活动安排(贪心算法)
贪心算法总是做出在当前看来是最好的选择。但贪心算法并不从整体最优加以考虑,它所做出的选择只是在某种意义上的局部最优选择。但其最终结果能达到预期目的,或者是最优解的近似解。活动安排是贪心算法的一个很好的例子:设有n个活动的集合E={1,2,3.....,n},其中每个活动都要求使用同一资源(一个时间段只能安排一个活动)。每个活动都有一个起始时间Si和一个结束时间Fi。如果选择了活动i,则它在半开原创 2017-07-07 12:48:10 · 5635 阅读 · 0 评论 -
乱数配合面积求π
#include#include#include#define N 50000int main(){ int i,sum=0; double x,y; srand(time(NULL)); for(i=1;i<N;i++){ x=(double) rand()/RAND_MAX; y=(double) rand()/RAND_MAX; if((x*x+y*y)<1)原创 2017-07-12 12:57:27 · 193 阅读 · 0 评论 -
随机数模拟抛硬币实验
在现实计算机上无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定程度上随机的,即伪随机数。线性同余法是产生伪随机数最常用的方法(这里不介绍)。下面用计算机产生大的伪随机数来模拟抛硬币试验。假设抛10次硬币,每次抛硬币得到正面和反面是随机的。抛10次硬币构成一个事件。调用Random(2)返回一个二值结果。返回0表示抛硬币得到反面,返回1表示得到正面。下面的算法TossCoin原创 2017-07-12 14:19:37 · 10756 阅读 · 0 评论 -
八皇后 拉斯维加斯算法
拉斯维加斯算法的一个显著特征就是它所做的随机性决策有可能导致算法找不到所需的解。因此常用一个bool型函数表示拉斯维加斯算法。找到解就返回true,否则返回false。n后问题典型的有回溯法(n后问题这里不多说),但是也是拉斯维加斯算法的一个很好的例子。(这里用八皇后实例,n后都是可行的)拉斯维加斯算法的思想如下:在棋盘上相继的各行中随机地放置皇后,并注意放置的合法性,直至n个皇后都相容的原创 2017-07-14 14:39:18 · 4317 阅读 · 0 评论 -
稀疏矩阵
稀疏矩阵如果在矩阵中,多数的元素并没有资料,称此矩阵为稀疏矩阵,由于矩阵在程序中常用二维矩阵表示,二维阵列的大小与使用的记忆体空间成正比,如果多数的元素没有资料,则会造成记忆空间的浪费。为此,必须设计稀疏矩阵的阵列存储方式,利用较少的记忆空间储存完整的矩阵资料。介绍:整列只储存矩阵的行数,列数与有资料的索引位置及其值,在需要使用矩阵资料时,再透过程式 运算加以还原,例原创 2017-07-13 17:26:24 · 484 阅读 · 0 评论 -
取石子(一)
描述一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子。游戏的规则是这样的。设有一堆石子,数量为N(1<=N<=1000000),两个人轮番取出其中的若干个,每次最多取M个(1<=M<=1000000),最先把石子取完者胜利。我们知道,TT和他/她的室友都十分的聪明,那么如果是TT先取,他/她会取得游戏的胜利么?输入第一行是原创 2016-11-18 23:26:26 · 412 阅读 · 0 评论 -
最少步数 (递归 搜寻)
最少步数时间限制:3000 ms | 内存限制:65535 KB难度:4描述这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 1,0,0,1,1,0,0,0,1 1,0,1,0,1,1,0,1,1 1,0,0,0,0,1,0,0,1 1,1,0,1,0,1,0,0,1原创 2016-11-20 18:07:47 · 991 阅读 · 0 评论 -
skiing 搜寻问题
skiing时间限制:3000 ms | 内存限制:65535 KB难度:5描述Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 1 2 3原创 2016-11-21 17:39:28 · 361 阅读 · 0 评论 -
吝啬的国度(超内存,未完成)
首先!这是个失败的小程序,程序没错,可以达到预期目的。但是,时间,内存都超出了要求。懒,以后有时间我会改进的。吝啬的国度时间限制:1000 ms | 内存限制:65535 KB难度:3描述在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必原创 2016-12-23 20:14:41 · 262 阅读 · 0 评论 -
回文字符串ACM问题
回文字符串时间限制:3000 ms | 内存限制:65535 KB难度:4描述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。输入第一行给出整数N(0原创 2017-01-16 19:15:26 · 1880 阅读 · 0 评论 -
递归排列(低效)
#includeusing namespace std;void Swap(char &a,char &b){ char temp; temp=a; a=b; b=temp;}void Perm(char list[],int k,int m){ int i; if(k==m) //只剩下一个元素 { for(i=0;i<=m;i++) cout<原创 2017-06-30 12:22:30 · 157 阅读 · 0 评论 -
八枚银币算法
说明现在有八枚银币,已知其中一枚是假币,其重量不用于真币, 但不知道是较轻还是较重,如何使用天平以最少的比较次数,决定 出哪枚是假币,并得知假币是较轻还是较重。#include #include #include void finallycompare(int coins[], int i, int j, int k){ if(coins[i]>coins[k原创 2017-06-30 12:20:43 · 826 阅读 · 1 评论 -
普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法
图是一种基础又重要的数据结构,图的生成树是图的一个极小连通子图。最小生成树是无向连通网的所有生成树中边的权值之和最小的一棵生成树。求图的最小生成树可以牵引出很多经典的题目,例如在N个城市之间建立通讯网络,问怎样最省经费(不同城市之间的联系网的费用不同,也即是边上的权值不同)。求图的最小生成树有两种算法,普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。下面是我对他们的简化理解。(只对K原创 2017-01-25 11:54:04 · 4878 阅读 · 1 评论 -
动态规划求最长公共子序列LCS
现在有两串字符串str1和str2,要求它们的最长公共子序列。首先要说的是,子序列的各字符可以是在原来的母串中分开的,但是前后是有序的,而子串的各字符则必须是在母串中连续挨着的。子串和子序列不要搞混。 要求它们的最长公共子序列,如果刚学习算法,那初学者肯定会想到一种很简单暴力的方法,就是先从str2中拆出若干个子序列,再将它们检查是否是str1的子序列,再选出最长的那个。原创 2017-01-15 18:53:12 · 403 阅读 · 1 评论 -
布线问题 队列式分支算法
印刷电路板将布线区域划分成n*m个方格阵列。精确的电路布线问题要求确定链接方格a到方格b的最短布线方案。在布线时,电路只能沿直线或者直角布线。为了避免线路相交,已布了线的方格做了封锁标记(红色方格),其他线路不允许穿过被封锁的方格。下面讨论用队列式分支界限法来解决布线问题。布线问题的解空间是一个图。解此问题的队列式分支界限法从起始位置a开始将它作为第一个扩展原创 2017-07-17 14:47:22 · 2657 阅读 · 2 评论