随笔分类 - 算法and数据结构
摘要:这个是STL中的特殊容器,和学习其他容器vector,queue,stack一样,我们用类比的方式来学习它。首先,当然是怎么定义了。。priority_queue<Type, Container, Functional>既然是优先队列,总该有个优先的原则吧,怎么去优先呢?显然你要给个标准它。这里我们就需要提供一个比较函数,记住STL中是使用"<"来进行优先级比较的。首先我们利用默认的比较函数来定义队列:priority_queue<int> q;这样我们声明的a是用基本容器vector装的int型数据,队列头是数值大的元素。要是我们想构造一个小
阅读全文
摘要:早就想写写几个排序的算法了,原来一直是直接调用库函数sort()和qsort(),导致自己对它们内部是实现机理有些忽视。现在就把我刚刚手写的一个归并排序(时间复杂度是o(n*log(n))),其中我是用递归来实现的。在代码中我还比较了手写归并,sort(),qsort(),的效率。 先对程序中所用的数据结构做下声明,方便大家理解接下来的程序:int res[cnt];int num1[cnt],num2[cnt],num3[cnt]; 其中res是归并时用的辅助数组,num1,num2,num3都是保存的是待排序的数,为了使程序具有可比性,所以把它们的元素赋成相同的值:void ini...
阅读全文
摘要:矩阵的快速幂是用来高效地计算矩阵的高次方的。将朴素的o(n)的时间复杂度,降到log(n)。这里先对原理(主要运用了矩阵乘法的结合律)做下简单形象的介绍:一般一个矩阵的n次方,我们会通过连乘n-1次来得到它的n次幂。但做下简单的改进就能减少连乘的次数,方法如下:把n个矩阵进行两两分组,比如:A*A*A*A*A*A => (A*A)*(A*A)*(A*A)这样变的好处是,你只需要计算一次A*A,然后将结果(A*A)连乘自己两次就能得到A^6,即(A*A)^3=A^6。算一下发现这次一共乘了3次,少于原来的5次。其实大家还可以取A^3作为一个基本单位。原理都一样:利用矩阵乘法的结合律,来减少
阅读全文
摘要:题目链接题目大意:给你两个字符串,让你求第二个字符串在第一个字符串中出现了几次,注意不能有重叠的区间。由于这题的数据不大,所以朴素的字符串匹配就能解决问题。代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 char str[1005],substr[1005]; 6 int len1,len2,cnt; 7 char *p,*q; 8 9 int main()10 {11 do12 {13 cnt=0;14 scanf("%s",str..
阅读全文
摘要:题目链接题目大意:给你一个数n,让你找到从1到n的序列,使相邻的两项相加的和是素数(包括第一个数和最后一个数的和)。经典的DFS题!dfs(int k,int now) //k表示递归的深度,now表示已生成序列的末尾数。贴代码了: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 5 using namespace std; 6 7 int ans[25]; 8 int f[25]; 9 int n;10 11 int isprime(int x)12 {13 for(int
阅读全文
摘要:题目链接题目大意是说:给你起个p*q的棋盘,然后让你用中国象棋的马去遍历棋盘,然后让你求出字典序最小的游历顺序。。这其实就是一个马的周游问题。同样的也是搜索,多的不说了。#include <iostream>#include <cstdio>#include <string>#include <cstring>using namespace std;string res; //保存答案int f[30][30]; //这里千万别开小了,开始的时候我就是开小了然后wa了几次int N;int a,b;int move[8][2]={{-1,-2},
阅读全文
摘要:题目链接在此题目大意:在棋盘中是“#”号的地方放置k个棋子,要求没有棋子在同一行同一列。求有多少种不同的放法。这道题有点很像 N后问题。。不过比N后问题要简单一些。这里我想说两种思路:1.因为每一行有且只有一个棋子,所以从第一行DFS到最后一行就能得到所有的解。2.由于这道题目中的棋盘边长n不大,所以也可以用是“#”号坐标来进行DFS。首先把所有是“#”号的左边都记录下来,然后在从中抽取k个不是在同一行同一列的点。方法一code:#include <stdio.h>#include <stdlib.h>#include <string.h>char maze
阅读全文
摘要:1 /* 2 a是前序序列 3 b是中序序列 4 后序序列将保存在c中 5 */ 6 void PostOrder(const char a[], const char b[], char c[], int starta, int startb, int startc, int len) 7 { 8 if(len==0) return; 9 if(len==1) { c[startc] = a[starta]; return; } 10 11 c[startc+len-1] ...
阅读全文
摘要:今天是我在自己的博客里发表的第一篇文章, 希望以后能把自己的博客越办越好 ,也希望和大家一起讨论,研究,成长进步 。好了废话不多说了!~开始我的题目。zoj1372 友情链接 :http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=372题目大意:给一个图,告诉其中的一些边,及其权值,让你找连通所有节点的最短路径和。其实就是最小生成树问题。 我采用的是prim算法解决的。首先讲一下prim算法: prim算法利用的是MST性质。MST性质: N=(V,E,C)是一个连通网,U是V的一个非空子集,若u,v满足weight(u,v)=
阅读全文

浙公网安备 33010602011771号