![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
算法
攀攀攀啦
这个作者很懒,什么都没留下…
展开
-
LeetCode134
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 来源:力扣(LeetCode) 暴力解法就是枚举每个起点i,从i开始能否完成一周,这里很多重复计算。假设从起点i开始最多能够到达某一点j,那么i+1最多也只能到达j。很多起点都可以直接跳过,需要考虑的点应该是从i无.原创 2020-09-27 17:38:50 · 104 阅读 · 0 评论 -
背包DP总结
01背包 问题:有n个重量和价值分别为wi和vi的物品,从这些物品中挑出总重量不超过m的物品,求所有挑选方案中价值总和的最大值。 使用dfs搜索时依次对第i种物品都考虑选择或不选择,如果选择那么剩余容量为m-wi,然后在剩余的物品中继续搜索;如果不选择那么剩余容量不变,继续在后面的物品中搜索。使用动态规划的方法,则把每次开始搜索时容量和当前需要判断的物品看做一个状态,得到的转移方程为 dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi]+vi) dp[i][j]=max(dp[i-1]原创 2020-09-23 16:04:38 · 209 阅读 · 0 评论 -
小和归并
给一个数组,对每个元素计算数组左边比当前元素小的元素和,最后将这些结果再求和。例如{1, 3, 5, 2, 4, 6}的小和为1+4+1+6+15=27。 这个题实际上是逆序数的变形,以元素3来说,后面的5,4,6比3大,所以小和都会将其计算一次,所以我们想要计算是对于任意元素i,右边比i大的元素个数。考虑归并排序能将左右两个有序数组合并,对于左边的任意元素i,都能计算得到右边比i大的元素个数。每一轮合并都能计算的到元素i右边比其大的元素个数,经过所有合并之后,就得能得到原数组中在i右边且比i大的元素个数。原创 2020-09-17 09:39:13 · 141 阅读 · 0 评论 -
KMP和扩展KMP算法
KMP算法 KMP算法能解决问题为:给一个主串S,模式串P,计算S中是否包含P,以及出现的位置。 当模式串P和主串S从S[i]匹配到长度L时失配,如果使用暴力匹配则需要从S[i+1]重新匹配,匹配位置在主串上出现回退。当模式串和主串S匹配长度L失配,那么从S[i]开始长度为L-1的子串与P的前L-1个字符是相同的,所以实际上重新匹配时模式串P和主串的S[i+1]匹配等价于模式串P和模式串的子串P[1]的匹配。利用这个现象可以提前计算出关于模式串P的一些匹配规则,可以加快匹配速度。 KMP算法计算的是失配数组原创 2020-09-17 09:20:18 · 202 阅读 · 0 评论 -
GCD & LCM Inverse poj2429 大整数分解(java实现)
问题描述 给两个数的gcd和lcm,反求最小的两个数。 问题分析 假设a、b的gcd为g,lcm为l,有a = m*g,b = n*g, n*m = l/g,于是问题变为求n和m。由整数分解的唯一性可以得到l/g可以分解为若干个素数的幂方积,即p1^a1 * p2^a2...* pn^an。由于n和m互质所以,就是将p1、p2...pn成两部分使其和最小。 注意点:题目中是多case,需要...原创 2020-05-08 13:29:08 · 211 阅读 · 0 评论 -
食物链 poj1182 并查集
问题描述 有N种动物,它们分为三类(A、B、C),它们之间的捕食关系为A->B->C->A。现在给出K条关于这些动物的关系,包括两种动物的捕食关系或者是同类。判断其中有多少条关系是错误(和前面的关系有矛盾)的。 问题分析 并查集能将同一种类的动物合并在一个集合中,但是这里需要表示捕食关系。这里x可以属于三类,那么最终合理的结果也可以分为3种,因此这里对结果合并,xA、xB和...原创 2020-05-07 17:08:32 · 109 阅读 · 0 评论 -
Find them, Catch them poj1703 并查集
问题描述 有N个嫌疑犯,它们属于两个犯罪团伙,目前得到的消息只能确定某两个嫌疑犯不在同一个团伙中,现在查询两个嫌疑犯是否在同一个团伙中。 问题分析 和食物链类似,这里两个嫌疑犯之间属于互斥的集合,通过取反使其能在同一集合中。 算法实现 import java.io.BufferedReader; import java.io.IOException; import java.io.In...原创 2020-05-07 17:07:29 · 132 阅读 · 0 评论 -
poj3713 Transferring Sylla (java实现)
问题描述 给一个N个节点的图,要求任意两个顶点之间至少有3条独立的路径,判断所给的图是否满足该条件。 问题分析 所有点之间都有3条独立的路径就表示点3连通图,如果任意删掉1个点,图仍然是双连通图,那么原图是3连通图。双连通图可以根据tarjan算法判断。 算法实现 import java.io.*; import java.util.Arrays; import static java.lang.Math.min; public class Main { StreamTok原创 2020-06-03 14:06:13 · 123 阅读 · 0 评论 -
Inner Vertices poj3109 离散化+树状数组 (java)
问题描述 无限大的棋盘上,在横向和纵向上被包围的白子会变成黑子,求最终黑子个数。 问题分析 问题在于求每个线段和其他线段有多少个交点。最开始的思路是枚举水平的扫描线,通过树状数组计算出与该扫描线相交的线段。树状数组通过判断每条扫描线上的黑色点是否是一个垂直线段的端点,然后更新树状数组。但是这样实现后总是TLE,不知道是什么原因,感觉每条扫描线上的黑色点必须逐个更新,就算使用双树状数组也也需要根据每个黑色点更新树状数组。 后来改用双树状数组AC了,感觉和单树状数组的复杂度只是常数差距。同样是枚举水平扫原创 2020-05-27 17:10:39 · 246 阅读 · 1 评论 -
MooFest poj1990 (Java)
问题描述 FJ有n头牛,排列成一条直线(不会在同一个点),给出每头牛在直线上的坐标x。另外,每头牛还有一个自己的声调v,如果两头牛(i和j)之间想要沟通的话,它们必须用同个音调max(v[i],v[j]),沟通起来消耗的能量为:max(v[i],v[j]) * 它们之间的距离。问要使所有的牛之间都能沟通(两两之间),总共需要消耗多少能量。 问题分析 首先将牛按照音调由小到大排序,依次遍历每头牛,因为当前牛的音调最大,所以只需要计算它到其他牛的距离之和。依次计算当前牛和每头牛的距离肯定会超时,只需分别计原创 2020-05-26 17:28:27 · 217 阅读 · 0 评论 -
网络流入门总结
1、理解增广路方法 Ford-Fulkerson方法基于增广路定理,当残量网络中中没有增广路时网络达到最大流,关于这些定理的理解和证明还得花些时间。我只能简单理解增广路就像将流量推回去一样,推回去的流量只要能流到汇点那就说明流量还可以增加。增广的方法是在网络中寻找一条从源点到汇点的增广路径,然后修改路径上的每条边的流量。 class Edge{ int from, to; long cap, dis; Edge next, rEdge; public Edge(int原创 2020-05-22 13:30:58 · 327 阅读 · 0 评论 -
九度OJ1172 哈夫曼树
来源: http://ac.jobdu.com/problem.php?pid=1172 题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。 输入: 输入有多组数据。 每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n&...原创 2019-07-19 15:25:37 · 313 阅读 · 0 评论