06 2020 档案
摘要:一、第一种初始化簇中心的方法:随机产生k个簇中心,保证簇中心的每个维度的取值都在这个纬度所有值的最小值与最大值的左闭右开区间内 import numpy as np class KMeans_1: def __init__(self,k_clusters,tol=1e-4,max_iter=300)
阅读全文
摘要:k近邻学习的一种实现时k-d树,用于搜索一个给定的向量周围k个与他距离最近的向量,好像ACM的数据结构里面也有着一条。 基于线性扫描算法的k近邻学习算法适合于处理数据集比较小的情况,时间复杂度大约是O(nlogn),搜索到这k个最近的向量之后就可以根据他们的众数选择属于哪一个类比较适合 k-d树代码
阅读全文
摘要:本文只构建一个能够识别一种英文符号的SVM,在此选择了C字符。 一、SVM构建 import numpy as np class SMO: def __init__(self, C, tol, kernel='rbf', gamma=None): # 惩罚系数 self.C = C # 优化过程中a
阅读全文
摘要:一、朴素贝叶斯分类器的构建 import numpy as np class BernoulliNavieBayes: def __init__(self, alpha=1.): # 平滑系数, 默认为1(拉普拉斯平滑). self.alpha = alpha def _class_prior_pr
阅读全文
摘要:一、分类树构建(实际上是一棵递归构建的二叉树,相关的理论就不介绍了) import numpy as np class CartClassificationTree: class Node: '''树节点类''' def __init__(self): self.value = None # 内部叶
阅读全文
摘要:一、决策树ID3递归算法的实现 import numpy as np class DecisionTree: class Node: def __init__(self): self.value = None # 内部叶节点属性 self.feature_index = None self.chil
阅读全文
摘要:一、基于sigmoid函数的logistic回归 import numpy as np class LogisticRegression: def __init__(self, n_iter=200, eta=1e-3, tol=None): # 训练迭代次数 self.n_iter = n_ite
阅读全文
摘要:朴素线性回归的实现,直接通过梯度为0解出w的估计值 import numpy as np class OLSLinearRegression: def _ols(self, X, y): '''最小二乘法估算w''' # tmp = np.linalg.inv(np.matmul(X.T, X))
阅读全文
摘要:题目链接:http://poj.org/problem?id=2891 解线性同余方程组,由于模数不是互质的,不能用中国剩余定理,但是可以通过扩展gcd的方法求解,时间复杂度大约是O(nlogn),当只有两个方程的时候可以容易求出解x,将x的通解凝聚成新的 模线性方程,接下来不断输入,进行n-1次迭
阅读全文
摘要:题目链接:http://poj.org/problem?id=1845 先分解质因数,然后求等比数列和,如果p-1和mod=9901不是互质的话由于9901是质数,所以p-1一定是mod的倍数,这个时候直接算出和即可,对于互质的,直接使用费马小定理 在O(logn)时间内求出逆元,与分子相乘即可,其
阅读全文
摘要:题目链接:http://poj.org/problem?id=3696 题目要求求最短的由连续的8构成的数使得这个数是L的倍数,我们首先求出phi(mod)可以证明a^x%mod=1的解x最大是phi(mod)而且其他解都是phi(mod)的约数,phi(mod)的约数大约是log(phi(mod)
阅读全文
摘要:题目链接:http://poj.org/problem?id=3090 从(0,0)向周围看去,能在(N,N)点以内看到的点的个数,假设x,y不是互质的,那么一定存在一个点(x/d,y/d)在(x,y)前面被看到,所以看到的点的x和y 一定是互质的,我们只需要扫描一遍n>=y>x.=2中的y就可以,
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/202/ 求解同时满足gcd(a0,x)=a1 和 lcm(b0,x)=b1的x的个数 解法是处理出b1所有的约数,逐一检查是否满足上述两个方程,由于采用试除法时间复杂度到了O(n*sqrt(b1)),大约是1e
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/201/ 求k对1-n所有数取模的和。 证明一段可以作为等差数列来求,证明如下:(转自ACwing) 代码如下: #include<iostream> using namespace std; typedef l
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/200/ 求解[1,N]之间的最大的反素数,有性质: 这个反素数是质因数个数最多的数中最小的一个。 证明:①假设有一个数质因数个数比它多,如果在他前面,不满足反素数的定义,如果在他后面,一定可以找到第一个质因数比
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/199/ 分解N!的质因数,因为N!的质因数不超过N,所以可以先预处理出[1,N]的质数,然后就是简单的求和计算了。 筛法采用的是优化之后的艾式筛法的优化了,算法的时间复杂度是O(n*loglogn),十分接近线
阅读全文
摘要:题目链接:http://poj.org/problem?id=2689 左右区间位于int大范围内但是区间长度只有1e6,所以可以考虑先筛出根号R内的质数之后用这些质数去筛(L,R)区间的质数,筛的时候注意至少要从2*p开始,因为p为质数 在(L,R)区间内第一个p的倍数和最后一个p的倍数分别是(L
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/184/ 给出正方形和某些边被删除,要求删除最少的边数使得其中没有任何正方形,策略就是将所有的正方形都存起来,可以从图中看见正方形的四条边都是等差数列,边长为5的大正方形拥有60条小边 接下来只要枚举最小的正方形
阅读全文
摘要:题目链接:http://poj.org/problem?id=2286 对于24个数组成的#,一共有8中拉的方式,求使得中间8个数相同的最小操作以及操作方式,由于一个结点扩展的分支有7个,所以朴素dfs将会在无法获得最优解的分支上花费太多时间 通过枚举操作次数可以避免dfs搜索过深,并且加上未来估计
阅读全文
摘要:题目链接:http://poj.org/problem?id=3460 题目给定一个乱序序列,长度为n,其中的数是1-n,操作是将其中一段插入任何一个位置,问最少需要多少次操作能够使得序列有序,超过四次直接输出5ormore 由于每个结点的分支数量达到了560,所以四层直接搜索时间复杂度很高,考虑I
阅读全文
摘要:题目链接:http://poj.org/problem?id=1077 使用A*搜索中的估价函数要小于等于真实值才能更快的收敛,本题中已经花费的开销是从start状态到目前状态的花费,也就是dist,可以将字符串映射到一个整数表示开销,如果在hash中没有这个键则表示 这个state并没与进入过队列
阅读全文
摘要:题目链接:http://poj.org/problem?id=2449 dijkstra算法中,一个点第一次从堆中出来的时候一定是最短路,第K次出来的时候一定是第k短路。 求解中可以使用A*设计估价函数使得结果朝着目标更快的收敛,本题设计的估计函数是该点到终点的最短路,因为这个最短路一定是小于目标函
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 地图中有两个鬼,两个人M和G,步长不同,鬼有曼哈顿距离计算的领域,问人能否相遇,实际上可以通过双向BFS求解。 注意每次点从队列中取出来的时候进行判断是否合法,实时判断,因为鬼是先进行分裂的,并且
阅读全文
摘要:题目链接:http://poj.org/problem?id=3635 题目和最短路算法的形式很像,只要对每个状态确定转移的分支即可,其中每次油量只加一,因为后续一定会在队列中被取出来重新加一(如果可以的话) 代码: #include<iostream> #include<cstring> #inc
阅读全文
摘要:题目链接:https://www.acwing.com/solution/content/8249/ 将两个结点之间能直接相连的边长视为0,不能直接相连的边长视为1,因为需要逆转,所以这个问题就变成了N*M个结点的最短路问题,可以通过双端队列搜索进行优化, 因为在队列中的点具有“两段性”和“单调性”
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/176/ 由于状态数量的限制,我们可以考虑捆绑人与箱子的状态,我们已知每次箱子的移动一定是由人引起的,可以考虑状态是箱子的位置和箱子推动的时候人的方向,用另一个BFS搜索人从当前位置 到达箱子旁边的该方向的位置但
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/175/ 题目给出一个01矩阵,要求对于每个点给出图中一个为1的点到这个位置的曼哈顿距离,要求这个曼哈顿距离最小。 转化成多源搜索,对于每一个1,扔进队列进行扩展,扩展到一个没访问过的点一定是到这个点的最短的曼哈
阅读全文
摘要:题目链接:http://poj.org/problem?id=3322 立体的推箱子形式的游戏,可以顺着某一条棱推,其中有些位置只能承受立方体的一半的重量。 这题并不难,理解了状态空间的纬度就很容易实现,其中状态是坐标、躺着的起始位置,躺着的形式。 搜索题目比较考验写代码的能力。 代码: #incl
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/173/ 要求从n件物品中选出若干件,重量之和不超过w并且最接近w,由于有45件最多,所以O(2^n)时间复杂度过高,可以考虑减半先搜索出结果,用另一半在前一半中二分寻找, 最终拼成结果,时间复杂度约为O(2^n
阅读全文
摘要:题目链接;http://poj.org/problem?id=2248 要求给出一个严格递增的数列,首元素是1,尾元素是n,并且要求最短。 可以得知,在一百以内的最优策略中,搜索的深度不会超过10,深度最坏的情况下是有100层的,而且深处数的分支会越来越多,考虑到层数最多是10层,所以我们可以考虑使
阅读全文
摘要:题目链接:http://poj.org/problem?id=1190 剪枝的常用思考策略:优化搜索顺序(从决策数量越少的位置开始决策)、排除冗余的等效的操作、可行性剪枝、最优性剪枝、上下界剪枝,其中在可行性剪枝方面可以利用“未来期望进行剪枝” 要充分利用不等式关系进行放缩,将不可能的状态进行剪枝,
阅读全文
摘要:题目链接;http://poj.org/problem?id=1011 又是拼木棍呀,不过这次我是对他的剪枝原理完全弄清楚了,最后两条剪枝还真的是很难想到的。这次的剪枝中加入了一条:我们在某一跟木棍中拼接时,选择的木棍长度是递减的,这样就保证了搜索树中不会有重叠的部分,不过其实在木棍中,小木棒是无序
阅读全文
摘要:题目链接:http://poj.org/problem?id=3074 本题的重点在于利用二进制位高效地判断一个位置能填哪些数,行、列、九宫格中能填的数的用一个二进制数表示,相与便是能填的数的二进制表示,使用lowbit函数可以 依次取出最低有效位进行搜索。基于几个常识:我们做数独的时候一定每次都是
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/167/ 首先看到这个数据范围就知道需要用搜索来实现,保存的当前状态是一共用了多少缆车,当前扫描的小猫编号 ,每个缆车中的重量。其中第三个状态是可以用全局数组来维护的, 前面两个状态作为dfs的参数传入,每次可以
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/166/ 计算有向无环图中每个点可达的点的数量,可以先通过拓扑排序确定点的拓扑序,因为在一个点处理之前,他所能到达的所有点都要先被处理,所以我们处理的顺序 只要是按照拓扑排序的逆序处理就能
阅读全文
摘要:#include<iostream> #include<string.h> using namespace std; #define maxn 100 int ver[maxn],head[maxn],nxt[maxn],size[maxn],len[maxn]; int n,m; int vis[
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/151/ 给定长度为n的序列,代表一个单词的出现次数,要求构造k叉哈夫曼树使得总权值最小,并且在权值最小的情况下问最小的高度是多少? 我们可以考虑不断取k个数组成一个新的结点放入优先队列,
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/149/ 题目中给出一些点在x轴上的位置,问选出k对位置的情况下,他们的两两距离之和的最小值是多少?容易直到,选中的位置一定是相邻的而且没有交集,我们对原始序列求差分之后问题 就变成了在这个差分序列中寻找k个不相
阅读全文
摘要:题目链接:http://poj.org/problem?id=2442 给定一个M*N的矩阵,要求从每一行中都取出一个数然后累加,问最小的N个累积和为多少。使用堆可以在O(MNlogN)时间复杂度内求出。 M行的最大取法一定是通过前M-1行的最大取法+第M行取数然后求前N大获取的,所以有归纳法可以考
阅读全文
摘要:题目链接:http://poj.org/problem?id=1456 题意是给出一些商品的价值以及过期时间,现在每天只能卖出一个商品,问卖出商品的价值总和最多是多少,贪心算法可以解决,用一个集合表示决策 将商品按照过期时间进行排序之后顺序扫描,如果过期时间大于二叉堆中的商品数量就直接放入,若等于就
阅读全文
摘要:题目链接:http://poj.org/problem?id=3764 我们可以在O(32*n)时间内求出一个长度为n的序列中取两个数的最大异或,而树中的异或有如下公式:path[x]=path(root,x) xor path(root,y),所以处理出path(root,i)之后就简化成了 简单
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/145/ 给定一个长度为n的序列,求一个最大的逆序对。利用Trie,每个整数都在树的底部,沿着二进制位进行延伸,匹配的时候优先匹配不同位,因为不同位翻转之后能加在结果上。 代码: #include<bits/st
阅读全文
摘要:字符串S从任意位置开始扫描,到了结尾之后从头开始扫描,一共有n个串,他们彼此循环同构,为了求出串S的字典序最小的同构串,可以通过下面的线性时间复杂度的算法得到。 代码如下: #include<bits/stdc++.h> using namespace std; char s[100]; int m
阅读全文
摘要:题目链接:http://poj.org/problem?id=1961 通过next数组求字符串截止到i位置的最小循环节以及循环次数,可以在O(N)时间内得出,通过这个方法可以求得字符串的任意长度的循环节。 代码如下: #include<iostream> #include<cstdio> usin
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/140/ O(N)时间复杂度,很高效;对64位自动溢出取模 代码: #include<iostream> #include<cstdio> #include<string.h> using namespace s
阅读全文
摘要:题目链接:http://poj.org/problem?id=3349 给出n个雪花,每个雪花有六角,如果两个角序列从某位置开始正序或者逆序是相等的,那就称这两个雪花相等,问是否存在两个相等的雪花。 使用Hash的思想,构造一个哈希函数进行定址,如果hash值相等就从这个值的链表中取出每个数进行判断
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/137/ 首先考虑朴素算法,对于一个端点i,考虑前面的[i-m,i-1]的前缀和,sum[i]-minsum[j] 1<=i<=n,可以维护一个长度为M的队列,对于下一个i,搜索队列中的最
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/135/ 可以证明每次切断的两段序列也是分别递减的,使用一个优先队列维护n个输入值的最大值,以及两个本来就有序的队列维护切断的两个序列即可。 注意本题需要使用longlong数据精度。 代码: #include<
阅读全文
摘要:题目链接:http://poj.org/problem?id=2259 由于同一个队伍的一定是连续的排队的,所以用一个队列记录排队的队伍顺序,用N个记录每个队伍内部的顺序。 代码: #include<iostream> #include<queue> using namespace std; #de
阅读全文
摘要:题目链接:http://poj.org/problem?id=2559 典型问题,就是有一个地方要注意,用数组模拟栈的时候要判断栈是否为空才能弹出元素,否则的话,设置一个st[0]=-1,这样矩形高度是0的时候就会自动判断栈空。 代码如下: #include<iostream> #include<c
阅读全文
摘要:递归求解,首先寻找最后一个加减号,拆分两段,若无最后一个加减号,寻找最后一个乘除号,这时这个表达式中只涉及括号外的乘除法(单个数算在内)。 这个算法实际上就是在将这个表达式分解成含括号的分量和含有乘法的分量,然后再按照乘法分量进行分解。 奉上案例: 1+3*4-(12-1)+20 代码如下: #in
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 由于当前的操作只和序列中的某一个指定的位置有关,可以从光标处将序列划分两段,分别维护两个栈,再维护左栈的前缀和以及前缀和最大值。 代码如下: #include<iostream> using na
阅读全文
摘要:题目链接:http://poj.org/problem?id=2054 贪心算法,思路参考yxc,涉及树的合并与缩点,将所有触发点构成的链全部缩进根节点即可得到最终的结果。证明: 代码如下: #include<iostream> using namespace std; const int maxn
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/116/ 证明转载于https://www.acwing.com/problem/content/description/116/ 使用“轻微扰动”的方法判断当前的选择是否是最优的,我们可
阅读全文
摘要:题目链接:http://poj.org/problem?id=1328 给出平面上N个点,要求在横轴上放置最少的点来覆盖N个点,其中每个点的覆盖半径都是R,可以将问题转化成用点覆盖线段的问题,计算N个点中每个点的可被管辖区间, 转化成求每个线段中至少有一个点的最少的点数。贪心思想。 代码: #inc
阅读全文
摘要:题目链接:http://poj.org/problem?id=3190 题目中给定N头牛的吃草开始时间和结束时间,每头牛必须单独在一个牛栏里吃草,问最少需要多少个牛栏能满足要求? 抽象出来的模型就是最少能将N个区间不相交地分布在多少个栏目中? 算法步骤: 将所有牛按开始吃草的时间排序;用小根堆维护当
阅读全文
摘要:题目链接:http://poj.org/problem?id=3614 题目可以抽象为:给定一些区间,和某些点,问最多有多少个区间能落入一个点(一个区间最多落入一个点),利用贪心的思想,将区间左端降序,顺序扫描区间,取最大的可被放进区间的点,因为 如果有两个点都能放进这个区间,那较小的点对下一个区间
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/111/ 首先定义了集合S的校验值,取出m对数,使得每对平方之后求和最大,这个值成为集合S的校验值。现在给定一个数列,求满足每段的校验值小于T的前提下最小能把数列分成连续的几段? 利用倍增
阅读全文
摘要:题目链接:http://poj.org/problem?id=3784 对顶堆算法:输入M个数的时候,将其中1~[M/2]个小的数存入大顶堆,将剩余数存入小顶堆,如果大顶堆中的数的数量大于[M/2]就讲堆顶元素取出扔到小顶堆中去, 当扫描到计数数量时,输出小顶堆的堆顶元素,也就是第[M/2]+1大的
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; typedef unsigned long long ull; #define pf printf #define
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/107/ 其中涉及前缀和和排序以及中位数三种基本思想。 代码如下: #include<bits/stdc++.h> using namespace std; typedef long lo
阅读全文
摘要:新建的编译环境中的内容是这样的: 指令变量的意义分别是:只编译、只运行、项目结构中编译以及运行、项目中只编译只运行等,这里的encoding不是sublime的编辑环境的encoding { "cmd": ["g++", "${file}", "-std=c++11", "-o", "${file_
阅读全文
摘要:题目链接:http://codeforces.com/contest/670/problem/C 一个电影有影视语言以及字幕语言,有m部电影以及n个人,每个人只会一种语言,语言的编号是一个int数,如果一个人能听懂影视语言就会非常开心,如果他听不懂影视语言但是听得懂字幕语言他将会比较高兴,如果他两个
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/description/104/ 给定一个序列,求连续的长度大于f的序列,其平均值最大,使用实数域的二分答案的方法。因为在这个问题中,答案是单调的,也就是说,这个平均值一定存在一个临界值,这个临界值的左边的所有的
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/102/ 给定一个序列,只能对一个区间加一或者减一,问至少需要多少步使得所有数都变成一致的?有多少种一致序列? 利用差分,对一个区间进行加一或者减一的话,一定是一个差分+1加上另一个差分-1。 代码如下: #in
阅读全文
摘要:题目链接:https://www.acwing.com/problem/content/103/ 首先,我们需要明白一点,就是假设之前输入了一对(A,B),那么下一对数据(C,D)要么与(A,B)是包含关系,要么是交集为空集,否则的话就不能满足两对之间都能看到彼此。 通过相对关系建立差分,区间加法+
阅读全文
摘要:描述:给出格子中的权值,求使用边长为R的正方形去覆盖,能得到的最大权值。 容斥原理求解即可。需要注意的是,由于内存的限制,无法再开一个5001*5001的数组来存储A,也就是原图,只能通过S数组以及递推关系进行求解,递推关系中要注意的是 边界情况下递推方程会衰减,并且容斥原理在边界位置也会衰减。 代
阅读全文
摘要:题目链接:http://poj.org/problem?id=3889 根据对称性以及规律可以分四种情况进行归纳。旋转的情况可以这样考虑, ①、对于位置为(x,y)的点,边长为k的正方形中,顺时针旋转九十度之后的坐标是(y,k-1-x), ②、对于位置(x,y)上的点,边长为k的正方形中,逆时针旋转
阅读全文
摘要:题目链接:http://poj.org/problem?id=1958 求A的B次方的所有约数之和对9901的模。使用分治算法计算等比数列的前缀和,时间复杂度为O(logC) 代码如下: #include<iostream> #include<vector> using namespace std;
阅读全文
摘要:题目链接:http://poj.org/problem?id=1958 代码: #include<iostream> #include<cstring> using namespace std; #define maxn 100 typedef long long ll; ll d[maxn],f[
阅读全文
摘要:给定n个点的带权路径,求0到n-1的最短哈密顿通路,使用位运算以及动态规划的思想进行精确计算,实际上算法能处理的结点数量大约在20个,如果只需要获得 比较优的解可以通过神经网络、模拟退火等最优化理论的算法进行搜索。 代码如下: #include<iostream> #include<string.h
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 通过先序以及中序遍历建树并且输出后序遍历的结果。 代码如下: #include<bits/stdc++.h> using namespace std; typedef unsigned int u
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 代码如下: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll;
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 代码如下: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll;
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1846 代码: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2067 #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; typede
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1521 代码如下: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll;
阅读全文
摘要:dp: #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; typedef unsigned long long ull; #define pf printf #def
阅读全文
摘要:以下代码中显示了二叉树的链式存储以及先序遍历递归建树,后序遍历释放资源,复制一棵二叉树,先序、中序、后序遍历的递归以及非递归实现,求叶子结点数量的递归以及非递归函数,求非叶子结点的递归以及非递归函数。求深度的递归函数。 文件输入,文件中的内容是 1 2 4 0 0 5 6 0 0 0 3 7 0 0
阅读全文