![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 68
为什么这么多叫solo
不要停下你的脚步
展开
-
百度笔试-房屋群
题目大意:为了进行城市规划,需要计算一个住宅区的住宅数目。该住宅区的俯视图已经做好,并规划成一个n×m的网格,如果某个网格单元具有屋顶的一部分,则向其赋值1,否则赋值0,由值为1的相邻单元组成的簇认定为一个单独住宅。对角放置的值为1的网格不被十位同一住宅区。 输入:n×m的二维数组,n表示行,m表示列 输出:整数k表示住宅的总数目import java.util.LinkedList;impo原创 2016-09-14 09:24:02 · 534 阅读 · 0 评论 -
poj2251
涉及算法:广度搜索(bfs)题目大意:现有一个三维的牢房,该牢房有a层,每一层有b排c列房间,现给定一个起始房间和一个终点房间,问是否可以从起点房间到达终点房间,如果可以,最少需要多少时间?注意:每一分钟移动一步,可以往上下左右前后6个方向移动题目分析:用一个三维数组表示地牢,值为1表示不能通行,为0表示可以通行,bfs直接搜索终点代码如下:package com.solo.b原创 2016-03-07 15:18:09 · 293 阅读 · 0 评论 -
poj2533
设计算法:dp+LIS题目大意给定一个序列A={a1,a2,…,an},现在要求出A的一个最长上升子序列的长度代码如下:import java.util.Scanner;public class Main_2533 { static int n;//序列的长度 static int[] a;//a[i]:序列的第i个值 static int[] dp;//dp[i]:以a原创 2016-03-07 15:17:21 · 393 阅读 · 0 评论 -
poj3009
涉及算法:dfs题目大意:给定一个矩形的区域,该区域由空白区域和障碍组成,给定起始点和终点,问将一颗石头从起点移动到终点最少需要多少步?注意:石头只能往上下左右四个方向移动,不能往对角线方向移动你往任意一个方向仍出石头,它都会滑动,除非它还没有移动就遇到了障碍物石头一旦扔出去,只有在以下几种情况下才会停下来1、撞击到障碍物(此时障碍物会消失,石头会停在障碍物前面)2、石原创 2016-03-07 15:14:31 · 349 阅读 · 0 评论 -
poj1129
感觉没有用到什么算法,直接模拟就是题目大意:无线网络中n个结点,每个结点都需要用信道来转发信息,但是为了避免干扰,邻居结点不能采用同一个信道,问对于给定的n和邻居关系图,最少需要多少信道?题目分析:A:BCD表示结点A和BCB相邻,可以用数组0~25来替代字母A~Z,即0:123;这方便我们用二维数组来表示相邻关系,例如:net[2][4]=1:表示2和4相邻代码如下:原创 2016-03-07 15:14:01 · 572 阅读 · 0 评论 -
poj2531
涉及算法:dfs题目大意:网络中有n台电脑,给出一个矩阵C表示电脑两两间通信需要的流量,例如C[i][j]=7表示电脑i和电脑j通信需要的流量为70,现在讲电脑分成两个集合,只有在不能集合中的电脑才需要通信,相同集合中的电脑不需要通信,问:最大的通信流量。题目分析:将电脑分为两个集合:集合0和集合1,每台电脑用两种选择,要么加入集合1要么加入集合2,这显然是一个双入口的dfs代码如下:原创 2016-03-07 15:13:02 · 449 阅读 · 0 评论 -
poj1416
设计算法:dfs题目大意:给定一个数a,将a从中间分开拆成几份,使得各部分的和sum最接近给定的目标数target,输出sum和拆分方案。注意:1、sum一定不能大于target,若所有方案的sum都大于target,则输出error。2、对于所求的sum有两种以上的方案可以实现,则输出rejected。题目分析:我们可以按照上如所示的方式进行搜索,1253拆分成(12原创 2016-03-07 10:14:08 · 486 阅读 · 0 评论 -
poj3083
涉及算法:bfs、dfs题目大意:给定一个矩形区域,由空白区域可障碍物组成,给定起点和终点,问:以左优先的方式走,从起点走到终点需要走过多少格?以右优先的方式走,从起点走到终点需要走过多少格?输出从起点走到终点最少需要走过多少格?题目分析:左优先:以当前的朝向为上,若左边可以走就走左边,若左边不可以走就走上边,若左边和上边都不可以走则走右边,若左边上边右边都不可以走则走原创 2016-03-06 17:13:16 · 436 阅读 · 0 评论 -
poj2488
涉及算法:dp题目大意:给定一个p行q列的棋盘,问是否能不重复的走过棋盘的每一格,若能则按字典顺序输出路径注意:我们只需要在搜索时按字典顺序搜索,就能按字典顺序输出路径代码如下:方式一:package com.solo.dfs;import java.util.Scanner;public class Main_2488 { static int a,b;/原创 2016-03-05 20:09:51 · 337 阅读 · 0 评论 -
poj1780
涉及算法:非递归的dfs题目大意:求出一个10^n+n-1的序列,其中包含了所有的0~10^n-1的数题目分析:由于序列长度的限制,我们想要一个一个的写出0~10^n-1所有的数,是不可能的。由于10^n+n-1比我们所需要输出的数的个数只多n-1,所以基本上我们所求的序列每一位都要表示一个数,即第i个数的前n-1位是第i-1个数的后n-1位,而第一个数由于前面没有数字,所以第1个数就只能原创 2015-09-30 20:43:29 · 1527 阅读 · 0 评论 -
poj1321
涉及算法:深度搜索题目大意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。棋盘有空白区域和棋盘区域,棋子只能放在棋盘区域代码如下:import java.util.Scanner;public class Main_1323 {原创 2015-09-17 22:24:34 · 410 阅读 · 0 评论 -
poj1062
涉及算法:dijkstra题目大意:部落里来个探险家,他看上了族长的女儿,但是族长说了想娶他的女儿得花10000个金币来换,可是探险家没有这么多钱,族长又说了,如果他可以弄来大祭司的皮袄,他就把女儿8000金就嫁给他,若是能弄来水晶球就只收5000金,探险家就去找大祭司求皮袄和水晶球,大祭司要他用金币来交换,或者能从别人那里弄来他需要的东西,他可以降低交换价格,所以探险家又跑到别人那里去,其他原创 2016-03-09 09:45:22 · 423 阅读 · 0 评论 -
求长度为n的序列中最大的m个数
思路1:最小堆,时间复杂度O(nlogm) 分析: 1、建一个大小为m的最小堆,最小的元素在根部 2、遍历序列,若元素大于根部元素,则用该元素替换根部元素,并对最小堆进行调整,若元素小于等于根部原色,则不对最小堆做任何改变,这样遍历完整个序列后堆中的元素就是最大的m个元素public class T1 { public static void main(String[] arg原创 2016-09-13 18:48:39 · 1787 阅读 · 0 评论 -
美团笔试-人民币
题目大意:有1、5、10、20、100五种面值的人民币,要用这五种面值凑成n(1 public static void solve(int n) { //dp[i][j]:表示只使用p[1]~p[i]中的值凑成成j,能有多少种情况 int[] p={0,1,5,10,20,100}; int[][] dp=new int[p.length原创 2016-09-12 17:12:34 · 607 阅读 · 0 评论 -
网易校招笔试-暗黑串
题目描述:长度为n的字符串,只能由A,B,C组成,其中包含ABC子串 的为纯净串,不包含ABC子串的为暗黑串。求长度为n的所有串中暗黑串个个数。 例如:n=2时,暗黑串有AA,BB,CC,AB,AC,BA,BC,CA,CB一共9个暗黑串题目分析: 暗黑串无非就两种形式:以两个相同的字符结尾,以两个不同的字符结尾 f[i][0]:表示长度为i的字符串中以XX形式结尾的暗黑串的个数 f[i][1原创 2016-09-13 09:23:17 · 622 阅读 · 0 评论 -
中缀表达式转后缀表达式_求表达式的值
中缀转后缀需要遵守以下规则 1、操作数:直接输出 2、“(”:直接入栈 3、“)”:”将“(”以前的直接输出,并将“)”出栈(不输出) 4、运算符+-*/:将优先级不小于该运算符的操作符出栈,最后将该运算符入栈 5、最后将栈中的元素依次弹出 6、优先级*/大于+-大于()class InToSuf{ public List<String> solve(String[] op)/原创 2016-09-11 22:20:23 · 1169 阅读 · 0 评论 -
链表是否有环,若有求出环入口
思路:用p1、p2分别遍历链表head,p1每次走一步,p2每次走两步,若有环最终他们会在某一点相遇,此时将p2从头开始遍历链表,这一次他们相遇的结点就是环的入口证明: 设入口为join,他们第一次在pos相遇,join到pos的距离为x,环的大小为R,则第一次相遇时有: p1走过的距离为:S=lenA+x+mR p2走过的距离为:2S=lenA+x+nR 可得:lenA=(n-2m)R原创 2016-09-11 12:59:18 · 517 阅读 · 0 评论 -
整数n的二进制形式中1的个数
方法1:通过将n的每一位与1做&,若结果为1则说明该位为1,否则为0。若n的二进制长度为k,则需要k次 static int sizeofone1(int n) { int cnt=0; while(n>0) { if ((n&1)==1) { cnt++;原创 2016-09-11 11:00:42 · 301 阅读 · 0 评论 -
算法分析—最长公共子序列(LCS)
子序列:给定一个序列X={x1,x2,…,xm},另一个序列Z={z1,z2,…,zk},即存在一个严格递增的X的下标序列{i1,i2,…,ik},对于所有的j=1,2,3…,k,满足xij=zj,我们称Z为X的子序列公共子序列:对于给定的两个序列X,Y,若Z既是X的子序列也是Y的子序列,则称Z是X和Y的公共子序列。我们需要解决的是求最长公共子序列定理:令X={下x1,x2,…原创 2016-01-15 11:18:01 · 1113 阅读 · 0 评论 -
最小生成树算法Prim、Kruskal
在介绍两种算法之前,我需要先介绍一个推论首先介绍一个概念,连通分量:其实就是一棵树(某些树也可能是一个节点)推论:对于无向连通图G=(V,E)。设A是G的某棵最小生成树的子集,并设C=(Vc,Ec)为森林Ga=(V,A)的一个连通分量,如果边(u,v)是连接C和Ga中某个其他连通分量的一条轻量级边,则(u,v)对于A来说是安全的。Kruskal算法在所有的连接两颗树的边里找到权重最原创 2015-09-23 21:33:20 · 935 阅读 · 0 评论 -
排序七部曲之(五)归并排序
并归排序采用的是分——合的策略,什么是分?什么是合?我们举个例子,例如要对长度为n的序列a排序,我们可以将序列a均分成两个部分,并且对着两个部分分别进行排序,这便是分。将排好序的两个部分按顺序整合到一起,这便是合。这样通过先分再合,就对序列a进行了排序。并归序列的难点在于合,两个排好序的序列如何合并成一个序列呢?(本文采用小到的排序)通过比较两个序列的第一个数得到较小的一个,取该数赋值给合并序原创 2016-05-17 20:19:19 · 399 阅读 · 0 评论 -
poj1426
快2个月没接触算法了,今天开始每天坚持算法学习,坚持刷题涉及算法:广度搜索+同余模定理题目大意:给定一个正整数n(1题目分析:bfs的过程如下:1 mod n10 mod n 11 mod n100 mod n 101 mod n 110 mod n 111 mod n.........同余模公式:(a+b)% n = (a%b+b%原创 2015-09-17 21:16:36 · 473 阅读 · 0 评论 -
poj3414
涉及算法:bfs题目大意:有两个空瓶子分别编号为为1、2,容量分别为A、B;我们可以对两个瓶子进行下面的三种操作:1、FILL(i):将i号瓶装满水2、DROP(i):将i号瓶的的水倒掉3、POUR(i,j):将i号瓶的水倒入j号瓶中,分两种情况:(1)i号瓶全部倒入j中,使得i空掉;(2)i号瓶倒入一部分到j中,使得j装满现在要将两个瓶子中任意一个的水量变为C,问最少需要原创 2016-01-22 12:20:42 · 380 阅读 · 0 评论 -
poj3287
涉及算法:bfs题目大意:给定两个整数n,k(n,k都是大于等于0小于等于100000),现在要把n变成k问需要多少次变化,对一个数x只能有三种操作:x+1,x-1,2*x题目分析:三入口的bfs,x的值不可能超过200000代码如下:import java.util.LinkedList;import java.util.PriorityQueue;import java原创 2016-01-21 20:25:42 · 460 阅读 · 0 评论 -
poj1328
算法:排序+贪心题目大意:有一个海岸和海,海岸是直的,海是水平的,海中有给定数量n个岛屿,我们在海岸上键雷达,雷达的覆盖半径给定为d,求至少需要建造多少个雷达才能覆盖全部的岛屿题目分析:题目已经建立好了坐标系,海岸为x轴,我们的雷达是建在x轴上的,对于每个岛屿,在x轴上都有对应一段区间可以建造雷达去覆盖。我们先计算出每个岛屿在x轴上对应的区间,再对区间按左端点大小进行升序排列。我们每次放置原创 2015-09-18 18:59:23 · 381 阅读 · 0 评论 -
poj1094
涉及算法:拓扑排序不知道什么是拓扑排序请参照这篇文章拓扑排序详解题目大意:要求根据给定的m组字符间的大小关系,给n个字符从小到大排序题目分析:首先将大小关系转化成为拓扑图,在找入度的时候注意:若没有找到入度为0的点说明出现了环即出现了矛盾;若找到多个入度为0的点则说明大小关系还不能确定,这时还需要继续找入度为0的点因为可能会找到环;若找到一个入度为0的点则继续寻找下一个入度为0的点当找原创 2015-09-20 21:08:13 · 370 阅读 · 0 评论 -
poj1125
设计算法:Floyd题目大意:输入n组数据,每组数据包括一个正整数m和m个数据对,例如第3次输入的数据为 2 1 4 3 5 表示编号为3的经纪人传播消息到编号为1的经纪人的时间为4,传播消息到编号为3的经纪人时间为5。要求根据n组数据求出由哪一位经纪人传播消息能以最快的速度让所有人都受到消息?求出该经纪人的编号和花费的时间题目分析:若知道两两间的最短路径当然能求出某个及节点到其他所原创 2015-09-21 10:03:17 · 466 阅读 · 0 评论 -
最小生成树详解
1、什么是最小生成树?对于无向图G=(V, E),V表示图中的结点,E表示图中的边,所谓最小生成树就是联通图G中所有结点所需要的边长度总和最小,这些边加上V就构成图G的一颗最小生成树。这样还不清楚我们可以举个例子:有n个城市分布在不同的地方,为了保证每个城市间都能用火车通行,我们需要在城市之间修铁路,但是为了节约成本,我们在保证每两个城市之间都能联通的情况下要使得所修的铁路长度最短。这就是一个原创 2015-09-23 19:36:19 · 3899 阅读 · 2 评论 -
深度优先搜索(DFS)详解
深度优先搜索是一种怎样的方法?深度优先搜索所使用的策略就如其名字一样,只要可能,就在图中尽量的深入。深度优先搜素总是对最近才发现的结点v的出发边进行探索,直到该结点的所有出发边都被发现为止。一旦结点v的所有出发边都被发现,搜索则回溯到v的前驱结点(v是经过该点才被发现的),来探索该前驱结点的出发边。该过程一直持续到从源结点可以到达的所有结点都被发现为止。如果还存在尚未发现的结点,则深度优先搜索原创 2015-09-30 16:14:03 · 14326 阅读 · 0 评论 -
poj1062
设计算法:dijkstra(最短路径)题目大意:部落中每个人手里有一件物品都有一个给定的价值,这些物品可以用某些指定的其他物品加上一定的金币来交换,年轻的探险家为了以最少的金币获得国王手中的物品(也就是过往的女儿),注意部落有森严的等级制度,超过等级限制的两个人不能直接或者间接交易,年轻的探险家可以不受等级限制即第一次可以与任何人交易。题目分析:建立最短路径算法的模型,将交换体系中的人看做原创 2015-08-24 10:53:58 · 592 阅读 · 0 评论 -
poj1080
涉及的算法:动态规划题意:根据给定的字符间的相似度矩阵求出两个字符串的最大相似度分析:对于两个给定的字符串X=(x1,x2,x3,......,xm),Y=(y1,y2,y3,......,xn);有三种可能的结尾方式:第一种以xm、ym结尾,第二种以xm、- 结尾第三种以-、yn结尾我们可以设dp[i][j]表示(x1,x2,....xi)与(y1,y2,......yj)的最大原创 2015-08-22 21:36:00 · 568 阅读 · 0 评论 -
poj1840
涉及算法:简单的哈希表题目大意:对于给定的a1,a2,a3,a4,a5求出a1*x1^3+a2*x2^3+a3*x3^3+a4*x4^3+a5*x5^3=0的解的个数即求-(a1*x1^3+a2*x2^3)=a3*x3^3+a4*x4^3+a5*x5^3的解的个数先枚举出左边的的所有数,存放到散列中,为了便于寻址采用hsah[leftNum]=leftNum出现的次数,这样时间复杂度由原创 2015-08-23 11:41:14 · 656 阅读 · 0 评论 -
poj1860
涉及算法:BellMan-Ford题目大意:给定几种货币和他们之间的交换关系,交换关系由汇率rab和手续费cab组成,举个例子若A-->B的交换关系为rab、cab,则用数量为v的货币A交换B可以得到的B的数量为:(v-cab)*rab。问s货币是否能够在若干次交换后数量增加题目分析:建立模型:每种货币都是一个结点,结点A—>B之间的权值为:(v-cab)*rab,找一条从s结点可以到达且原创 2015-08-25 15:58:15 · 877 阅读 · 0 评论 -
poj1068
简单的模拟题目大意:对于给出的原括号串,存在两种数字密码串:1、p序列:当出现匹配括号对时,从该括号对的右括号开始往左数,直到最前面的左括号数,就是p[i]的值。2、w序列:当出现匹配括号对时,包含在该括号对中的所有右括号数(包括该括号对),就是w[i]的值。对给出的p数字串,求出对应的s串。串长限制均为20代码如下://先求出源串+从左至右遍历串标记右括号和其原创 2015-09-01 11:35:44 · 474 阅读 · 0 评论 -
poj1159
涉及算法:dp+lcs题目大意:对于给定的字符串S,求出最少需要在S中添加多少个字符可以使S对称(我们称此事S为回文串),即从左往右看s和从右往左看S是一样的,题目分析:两种思路思路一:设dp[i][j]为字符串S从第个字母到第j个字母S之间的这段字符串S(i,j)需要填加的字符数,使得S(i,j)为回文串。思路二:S中需要填加的字符数等于:S的长度-S和其逆序列S’的最长公共原创 2016-01-14 20:14:06 · 335 阅读 · 0 评论 -
poj1260
涉及算法:动态规划(dp)题目大意:给定n种不同种类的珍珠,每种珍珠对应着一个单价和一个购买量,要求我们以最少的钱买到同样总量珍珠,而且保证珍珠的品质不能下降,任意购买一种价格为p数量为n的珍珠需要支付:(n+10)*p题目分析:我们以dp[i]表示只考虑购买第1到第i种珍珠所花费的最少的钱,amt[i]表示需要购买的第i种珍珠数,sum(i,j)表示第i到第j种珍珠的总数,p[i]表原创 2015-09-19 09:10:32 · 438 阅读 · 0 评论 -
poj3126
涉及算法:bfs题目大意:将一个四位的素数a变成四位的素数b需要多少次改变?注意,每次只能改变某一位的数字,且改变后的数也是素数。题目分析:40入口的bfs代码如下:import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class Main_3126 { st原创 2016-01-21 13:07:47 · 291 阅读 · 0 评论 -
poj3087
设计算法:模拟题目大意:洗牌大家都知道吧,有两叠纸牌,每叠张数相同,将这两叠纸牌混合到一起,最底下一张为第二叠纸牌的最底下一张,然后上面是第一叠纸牌的最底下一张,依次交叉,最上面一张为第一叠纸牌的最上面一张。如下图所示:将s12平均分成两部分,下面的部分为s1上面的部分为s2,按照以上的方式再次进行洗牌,依次类推。问,是否可以通过以上方式得到目标S这题被归类到bfs,但是没原创 2016-01-20 21:08:24 · 413 阅读 · 0 评论 -
poj2251
设计算法:广度搜索题目大意:给定一个a层,b行,c列的三维地牢,并给定了一个起点和终点,要求以最短的时间从起点走到终点,“.”表示可走区域t,“#”表示不能通过区域题目分析:明显的广度搜索代码如下:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;原创 2015-09-18 15:57:59 · 358 阅读 · 0 评论 -
poj3267
涉及算法:dp题目大意:现有一个长度为m的字符串s和n个单词,现在需要删除字符串中的某些字符,使得剩下的部分可以用n个单词的中的某些来表示,求最少需要删除多少个字符。题目分析:设dp[i]表示从s的第0个字符开始长度为i的字符串需要删除的字符数(末位位i-1),则dp[i]是取决于dp[1]~dp[i-1]的,如果s[i]加上其前面的一些字符(可以不连续)能和某个word匹配,则dp[i]原创 2016-01-19 17:44:53 · 375 阅读 · 0 评论