随笔分类 - [05] 算法思想
摘要:#include #include char A[100],B[100];int next[100];int n, m;void _next(){ int i = 1; int j = 0; next[1] = 0; while(im) return i-m; else return -1;}int main(int argc, char const *argv[]){ int t; scanf("%d", &t); while(t--){ scanf("%s", B); scanf("%s", A); ...
阅读全文
摘要:如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。 我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:...
阅读全文
摘要:首先 先介绍一下 FLOYD算法的基本思想设d[i,j,k]是在只允许经过结点1…k的情况下i到j的最短路长度则它有两种情况(想一想,为什么):最短路经过点k,d[i,j,k]=d[i,k,k-1]+d[k,j,k-1]最短路不经过点k,d[i,j,k]=d[i,j,k-1]综合起来: d[i,j,k]=min{d[i,k,k-1]+d[k,j,k-1],d[i,j,k-1]}边界条件: d[i,j,0]=w(i,j)(不存在的边权为∞)floyd算法的流程:把k放外层循环,可以节省内存对于每个k,计算每两点的目前最短路代码(需记忆)for k:=1 to n dofor i:=1 to n
阅读全文
摘要:最短路径 dijkstra 1 #include 2 #include 3 #include 4 5 #define MAX INT_MAX 6 #define N 100 7 8 int map[N][N]; 9 int len[N];10 int vis[N];11 int n;12 13 void build() {14 15 int i, j;16 int u, v, c;17 int m; 18 19 scanf("%d", &n);20 memset(map, -1, sizeof(map));21 scanf...
阅读全文
摘要:优先级队列: 1 #include 2 3 int A[100]; 4 int heapsize; 5 6 void swap(int i, int j) { 7 int temp = A[i]; 8 A[i] = A[j]; 9 A[j] = temp;10 }11 12 void huifu(int i){13 int maxheap = i;14 int l = 2*i;15 int r = 2*i + 1;16 if(l A[maxheap])17 maxheap = l;18 if(r A[ma...
阅读全文
摘要:7.29 黄昏时刻(一) 全排列建模: 给了数字n 代表从1-n 个数全排列思路: 1. 输入n,如果n值为‘0’,则退出程序 2. vis[i] 保存 是否对第i个数字进行访问 3. dfs 遍历1-n 个数字的全排列,若重复访问,则越过。直到最终访问结束输出访问的的结果。之后回溯删掉对数字的访问。优化: none代码: 1 #include 2 #include 3 4 int a[20] ,n, vis[20]; 5 6 void dfs(int s) { 7 int i; 8 //如果dfs 次数为n,则输出a数组的内容 9 if(s...
阅读全文
摘要:思想:目的:将中缀表达式(即标准形式的表达式)转换为后缀式。例子:a+b*c+(d*e+f)*g转换成abc*+de*f+g*+转换原则:1.当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中。2.如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出。3.在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理)的时候,否则决不从栈中移走"("。操作符中,+-优先级最低,()优先级最高。4.如果读到输入的末尾,将栈元素弹出
阅读全文
摘要:dd版本:实战中,未被超越。 1 void quick_sort(int *a,int f,int t) 2 { 3 int i,j,k; 4 i=f; 5 j=t; 6 k=a[f]; 7 8 if(i>=j) return; 9 10 while(i=k)13 j--;14 if(i 2 #define N 250000 3 4 void quick_sort(int *a,int f,int t) 5 { 6 int i,j,k; 7 8 while(f =k)16 ...
阅读全文
摘要:判断素数:第一种方法用于小数据。 1 int k=0; 2 int isprime(int num) 3 { 4 int i, j; 5 j = sqrt(num); 6 for (i = 2; i 2 #include 3 #include 4 5 #define N 100000 6 #define yes '1' 7 #define no '0' 8 char flag[N+1]; 9 10 void is_prime(int n)11 {12 int i, j;13 memset(flag, yes, sizeof(flag)...
阅读全文
摘要:SELECTION-SORT(A)n : length[A] for j : 1 to n − 1 do smallest : j for i : j + 1 to n do if A[i] 0 and A[i]>key do A[i+1] : A[i] i : i-1 A[i+1] : keyMERGE(A, p, q, r) n1 : q-p+1 n2 : r-q create arrays L[1..n1+1] and R[1..n2+1]for i : 1 to n1 do L[i] : A[p+i-1] for j : 1 to n2 do R[...
阅读全文
摘要:1 #include <stdio.h> 2 3 /* count lines in input */ 4 int 5 main() 6 { 7 int c, pc; /* c = character, pc = previous character */ 8 9 /* set pc to a value that wouldn't match any character, in case10 this program is ever modified to get rid of multiples of other11 ...
阅读全文
摘要:1 #include <stdio.h> 2 #include <string.h> 3 #define MAX 1000 4 5 int p[MAX]; 6 int rank[MAX]; 7 void init(int n){ 8 int i; 9 // memset(rank, 0, sizeof(rank));10 for(i=1;i<n;i++) {p[i]=i;rank[i]=0;}11 }12 13 14 int find_root_digui(int x){15 if(x!=p[x])16 return p[x]=find_roo...
阅读全文

浙公网安备 33010602011771号