![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法基础
文章平均质量分 73
King_Tom
。。。
展开
-
字符串相关算法:KMP、
KMP算法:next数组构建、字符串匹配原创 2022-03-05 15:22:10 · 420 阅读 · 0 评论 -
BFS练习
BFS练习概述POJ1324概述POJ1324该题在BFS的基础上加入了状态压缩;由于蛇不能碰到自己的身体,因此每一步状态需要记录身体的位置;如果直接使用int记录身体每一段坐标(x, y),内存消耗将非常大;考虑这么一种压缩:移动过程中蛇身体的每一段的下一步位置是其前一段的当前位置,因此可以从蛇头位置往后回推蛇身的位置;另外,BFS的过程中是一定会记录移动方向的,记录身体的每一段的移动方向,由当前某一段身体位置往其反方向移动就可得到移动前其后一段的位置,因此可考虑记录身体每一段的下一步移动方原创 2021-12-21 10:32:25 · 239 阅读 · 0 评论 -
线段树练习
线段树练习POJ2828POJ2828由于前面来的人会有被插队的可能,因此从前往后处理排队的人会使得已经在数组中的人位置不断变化,增加计算量;可考虑从后往前处理:此时这人只要一入数组,就不可能会被插队,也就是说位置不会再变;使用权值线段树解决:定义que为最后的队列,blank为该节点剩余空位;考虑这么一种情况:最后一个人插到位置1,此时剩下位置2、3、4,倒数第二人想要插入到位置2,但其实这个位置是相对于早于他之前来的人而非相对于这最后一人,而节点2维护的位置区间只剩下一个位置留给前面的原创 2021-12-14 22:50:31 · 158 阅读 · 0 评论 -
51Nod1383---整数分解为2的幂
51Nod1383---整数分解为2的幂容易想到对于某一个数i,它的组合可以看成是i-1的每一种组合加上一个1,但这个1可能会与其他1合并,从而产生新的组合;当i为奇数时,发现其中有一个1一直没有被合并;对于i-1的每一个组合插入一个1,如果发生合并只会占了原本需要合并、产生新组合的1的位置,因此最后不会产生新组合;但是当i为偶数时,因为i-1的每一种组合最后必定剩下一个从来没有被合并...原创 2019-04-30 17:10:46 · 183 阅读 · 0 评论 -
欧拉回路
HDU1878---欧拉回路#include <bits/stdc++.h>#define For(i,x,y) for(int i=(x);i<=(y);++i)#define Fov(i,x,y) for(int i=(x);i>=(y);--i)#define Fo(i,x,y) for(int i=(x);i<(y);++i)#define m...原创 2019-05-04 21:50:51 · 176 阅读 · 0 评论 -
状压DP
1. 物品数量很少2. 需判断状态合理性POJ2923---Relocation题目要求清掉所有物品,且物品数量很少,想到状压dp;首先要找到所有一次搬运的合理状态v[i];对于每一种状态S,它的总重量为sum,一辆车的装载问题可以看成01背包问题;然后可以扫描c1以内的任意重量x,如果x是能够达到的重量且sum-x<=c2即两辆车能够装下,此时S即为合理状态;最后就是...原创 2019-03-02 21:52:51 · 204 阅读 · 0 评论 -
反转问题
一维反转问题POJ3276---Face The Right Way题目要求使得反转次数最少时每次连续反转个数最小值;可以枚举所有连续反转个数k(1<=k<=n),对于每一个k求出对应的反转次数;容易想到,左端第一头牛只能被以它为开头的连续长度为k的区间覆盖,如果它朝后,那么必须进行一次反转,而且以后再次反转是无谓的,因而可以从一端开始计算;若此时考虑第i头牛,它能够...原创 2019-02-27 18:26:13 · 631 阅读 · 0 评论 -
01背包问题
1.每种物品只有一个,背包有特定容量2.每扫描一种物品,更新一次背包状态3.逆序递推,保证当前要更新的状态是由上一次更新的状态得到ACM-ICPC 2018 焦作赛区网络预赛K---Transport Ship背包容量为S,x条第i种船看做一种物品;任意条数x,可以分解为x=2^0+2^1+...+2^k,因而不必扫描所有条数而直接扫描二进制位即可囊括所有x#inclu...原创 2019-03-02 20:43:29 · 133 阅读 · 0 评论 -
博弈论
如果一个状态可以到达必败态,那么这个状态就是必胜态,而初始状态sg[0]即无牌可抓就处于必败态,n的范围不大,可以递推处理所有状态题目:HDU1847---Good Luck in CET-4 Everybody!#include <bits/stdc++.h>#define For(i,x,y) for(int i=(x);i<=(y);++i)#define F...原创 2018-08-05 16:48:56 · 143 阅读 · 0 评论 -
图论
一、割点在无向连通图中,如果将其中一个点以及所有连接该点的边去掉,图就不再连通题目:POJ1523---SPF求SPF也就是求割点以及每个割点将系统分成几个连通分量Trajan算法选定一个根节点root进行DFS对于根节点,如果有x>=2棵子树,则为割点,并将系统分割为x个连通分量定义dfn[i]为节点i的DFS首次被访问时间,low[i]为i及i的子节点通过回边...原创 2018-08-10 10:44:38 · 260 阅读 · 0 评论 -
数据结构
一、队列题目1:POJ2823---Sliding Window#include<cstdio>#include<iostream>#include<algorithm>#include<queue>#include<cstring>#include<string>#include<cctype&g原创 2018-08-20 17:08:28 · 226 阅读 · 0 评论 -
组合及概率
一、排列组合有重复元素的全排列设一组数中有x种,共有n个数,每种数的个数为ans=题目:ACM-ICPC 2018 焦作赛区网络预赛L---Poor God Water#include <bits/stdc++.h>#define For(i,x,y) for(int i=(x);i<=(y);++i)#define Fov(i,x,y) for(int...原创 2018-08-20 17:17:30 · 2200 阅读 · 0 评论 -
DP
题目:ACM-ICPC 2018 焦作赛区网络预赛B---Mathematical Curse#include <bits/stdc++.h>#define For(i,x,y) for(int i=(x);i<=(y);++i)#define Fov(i,x,y) for(int i=(x);i>=(y);--i)#define Fo(i,x,y) for(...原创 2018-08-23 21:17:06 · 212 阅读 · 0 评论 -
数论
一、欧几里得算法int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}若gcd (a, b)=m,则gcd (a/m, b/m)=1最小公倍数 LCM(a,b)=a/gcd(a,b)*b题目:POJ2773---Happy 2006由题目可知k的范围明显比m大,想到往周期性靠拢由gcd性质可得gcd(a, b)=gcd...原创 2018-08-27 15:41:20 · 178 阅读 · 0 评论 -
字符串
一、KMP算法int nex[n_max];void getnext(char* p){ int len=strlen(p),k=-1,j=0; nex[0]=-1; while(j<len-1) { if(k==-1||p[j]==p[k]) nex[++j]=++k; else k=nex[k]; }}...原创 2018-09-11 10:30:43 · 162 阅读 · 0 评论