算法竞赛常用方法笔记(更新ing)

 eclipse代码自动提示:

             点击Windows,选择下拉菜单里面的preferences,选项auto activation triggers for java后的文本框中输入abcdefghijklmnopqrstuvwxyz.即可

//背包问题 w:重量    v:价值     n:w.len即为物品种类数    s:总容量
static int dp(int[] w,int[] v,int n,int s){
		int[][] dp = new int[n][s+1];
		for (int j = 0; j < s+1; j++) 	//初始化第一行
			dp[0][j] = j/w[0]*v[0];
		for (int i = 0; i < n; i++) 	//初始化第一列为0
			dp[i][0] = 0;
		for (int i = 1; i < n; i++) {
			int max = 0;
			for (int j = 1; j <= s; j++) {	//dp找第i行第j列最优解
				for (int k = 0; k*w[i] <= j; k++) 	//j重量下 选择k个i
					max = Math.max(max, k*v[i]+dp[i-1][j-k*w[i]]);
				dp[i][j] = max;
			}
		}
		return dp[n-1][s];
}

	
//二分查找
static int search(int[] arr,int x,int low,int high){
	int index = (high+low)/2;
	if(low>high)	return -1;
	if(arr[index] == x)	return index;
	else if(arr[index] > x)	return search(arr, x, low, index-1);
	else	return search(arr, x, index+1, high);
}

//匹配正则
//	\s空白字符 \S非空白字符	+至少一次	*至少零次	?至多一次
//	[a-z]匹配其中所有字母	[a-z]{0,5}匹配0~5	(a|b)中可使用|&符号

String[] arr = "aaa  ssd  bs  b".split("\\s+");

static void reg(){
	String reg="\\S+";
	Pattern pattern=Pattern.compile(reg);
	Matcher m=pattern.matcher("aaaa? adsaf? fsa");
		while(m.find()){
			System.out.println(m.group(0));
		}
}

//全排列方式
static void f(char[] c,int index){
	if(index==c.length-1){
		System.out.println(c);return;
	}
	for (int i = index; i < c.length; i++) {
		char temp=c[i]; c[i]=c[index]; c[index]=temp;
		f(c, index+1);
		temp=c[i]; c[i]=c[index];c[inde]=temp;
	}
}
//n个长度的全排列数目
static int q(int n){
if(n==1)return 1;
return n*q(n-1);
}

//取小数点后两位 四舍五入
System.out.println(String.format("%.2f", 1.6667));

//10进制转26进制 
static void jin_26(){
int b=255;
String str = "";
while(b>0){
	int m=b%26;
	if(m==0) m=26;
	str=(char)(m+64)+str;
	b=(b-m)/26;
}
System.out.println(str);
}

//求最大公约数的方法
public static int gong_yue(int x,int y){
if(x<0) x=-x;
if(y<0) y=-y;
if(y==0)return x;
return gong_yue(y, x%y);
}

//浮点数不能直接用==比较? 因为 (0.1+0.2)==0.3 为 false
System.out.println((0.1+0.2)==0.3);
//浮点数比较可以合为整数 
System.out.println((1+2)==3);
//或者比较近似值System.out.println((Math.abs((0.1+0.2)-0.3))<1E-10);
//一般1E-6便足够使用
System.out.println(1E-6);
DFS深度优先遍历
DFS(dep,...)	//dep带便目前DFS深度
{
	if(找到解||走不下去了)
	{
		...
		return;
	}
	枚举下一种情况,DFS(dep+1,...)
}

BFS广度优先遍历
通常用队列(先进先出)实现
    初始化队列Q.
    Q={起点s};标记s为已访问
	while(Q非空){
		取Q队首元素u;u出队;
		if(u==目标状态){...}
		所有与u相邻且未被访问的点进入队列
		标记u为已访问;
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)   排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排  序,外部排序)   数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余方程,中国剩余定理) 指针(链表,搜索判重,邻接表,开散列,二叉树的表示,多叉树的表示) 按位运算(and,or,xor,shl,shr,一些应用) 图论(图论模型的建立,平面图,欧拉公式与五色定理,求强连通分量,求割点和桥,欧拉回路,AOV问题,AOE问题,最小生成树的三种算法,最短路的三种算法,标号法,差分约束系统,验证二分图,Konig定理,匈牙利算法,KM算法,稳定婚姻系统,最大流算法,最小割最大流定理,最小费用最大流算法) 计算几何(平面解几及其应用,向量,点积及其应用,叉积及其应用,半平面相交,求点集的凸包,最近点对问题,凸多边形的交,离散化与扫描) 数据结构(广度优先搜索,验证括号匹配,表达式计算,递归的编译,Hash表,分段Hash,并查集,Tarjan算法,二叉堆,左偏树,二斜堆,二项堆,二叉查找树,红黑树,AVL平衡树,Treap,Splay,静态二叉查找树,2-d树,线段树,二维线段树,矩形树,Trie树,块状链表) 组合数学(排列与组合,鸽笼原理,容斥原理,递推,Fibonacci数列,Catalan数列,Stirling数,差分序列,生成函数,置换,Polya原理) 概率论(简单概率,条件概率,Bayes定理,期望值) 矩阵(矩阵的概念和运算,二分求解线性递推方程,多米诺骨牌棋盘覆盖方案数,高斯消元) 字符串处理(KMP,后缀树,有限状态自动机,Huffman编码,简单密码学) 动态规划(单调队列,凸完全单调性,树型动规,多叉转二叉,状态压缩类动规,四边形不等式) 博奕论(Nim取子游戏,博弈树,Shannon开关游戏) 搜索(A*,ID,IDA*,随机调整,遗传算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值