算法
文章平均质量分 95
ysugarr
克己奉公
展开
-
【笔试算法】本科学的算法全都还给老师了
一、自定义排序当年用C++写了十几遍这种题,结果笔试的时候还是没有写出来,唉!问题出在只判断姓名字典序的时候,x.name[i] < y.name[i] return了-1,但是x.name[i] > y.name[i]的时候没有return.var height = '176 176 176 176 170';var names = 'beta alpha bamma a a';height = height.split(' ');names = names.split(' '原创 2022-04-13 22:29:57 · 522 阅读 · 1 评论 -
labuladong算法学习
遇到任何递归型的问题,三问 [定义、状态、选择] :这个函数是干嘛的? 这个函数参数中的变量是什么的是什么? 得到函数的递归结果,你应该干什么?原创 2022-03-12 23:59:13 · 1352 阅读 · 2 评论 -
【算法】递归
Q1:输入:print(tupleise(7, [10, 99, 35, 40]))输出:[(7, 10), (7, 99), (7, 35), (7, 40)]参考代码:def tupleise(value, items): if len(items) == 1: return [(value, items[0])] return [(value, items[0])] + tupleise(value, items[1:])print(原创 2020-06-09 23:37:25 · 135 阅读 · 0 评论 -
【算法】计算时间复杂度
O(n)小于等于 o(n)小于 Ω(n)大于等于 ω(n)大于 Θ(n)等于 判断时间复杂度原创 2020-06-07 22:35:06 · 370 阅读 · 0 评论 -
【算法】贪心
活动安排问题描述:给很多电影的开始和结束时间,看每个电影之间需要间隔3分钟,返回看尽可能多的电影的个数。编写函数max_num_movies(movie_list),movie_list 是(start_time, end_time) 元组。样例:movie_times = [ (299, 330), (250, 350), (280, 297), (340, 360), (360, 380), (300, 337)]print(max_n原创 2020-06-07 22:26:41 · 142 阅读 · 0 评论 -
【算法】图 (6) 最小生成树Prim
Prim算法的核心为:保证树的权重总和相加最小distance[]:表示 某个点 还未被加入最小生成树的时候 离当前的生成树的距离parent[]:前结点in-tree[]:该点是否被访问过输入样例:graph_string = """\ U 7 W 0 1 5 0 2 7 0 3 12 1 2 9 2 3 4 1 4 7 2 4 4 2 5 3 3 5 7 4 5 2 4 6 5 5 6 2 """转化为邻接表:adj_list = ..原创 2020-05-18 14:10:40 · 168 阅读 · 0 评论 -
【算法】图 (5) 强连通图
如何判断一个图是强连通图?强连通图(strongly connected):在一个图中,任意两点x,y,都可以互相到达(可以借助其他点作为中转);1 简单方法对每个结点进行DFS或者BFS搜索,如果每次搜索的结果,使得每个点的state都标记为“Processed”,则表示该图为强连通图,时间复杂度为,其中是DFS的时间复杂度;2 通过hub来判断强连通图先验知识:2.1 图的转置图中所有的点不变,但是所有的边的方向都反向输入样例:graph_string = ""原创 2020-05-18 13:46:45 · 6635 阅读 · 0 评论 -
【算法】图 (4) 拓扑排序
D 40 20 11 23 2拓扑序列:(一定是在有向图中)3,0,1,20,3,1,20,1,3,2D 4(只有4个点,没有边)有多少种拓扑序列?答:n!=n*(n-1)*(n-2)…*2*1(因为每个点的入度都为0)1 根据入度的定义求拓扑序列入度:有向图中某点 作为图中边的终点 的次数之和。每次挑选一个入度为0的点,然后记录该点,删除该点以及其相邻的边,更新其他点的入度;继续挑选,记录删除;如此以往得到的序列就为拓扑序列。to be continu..原创 2020-05-18 13:25:23 · 723 阅读 · 0 评论 -
【算法】图 (3) Depth-first-search
BFS通过队列FIFO来访问顶点,而DFS通过(call)stack来实现FILO,每次访问到最深的的点。1 BFS伪代码(可以先跳过这一节)DFS-TREE DFS-LOOP2 时间复杂度假设点|V|=n, 边|E|=m;DFS-TREE: DFS-LOOP:DFS:3 算法分析输入样例:graph_str = """\ U 7 1 2 1 5 1 6 2 3 2 5 3 4 4 5 """利用上一节-图的初始化(1)-将字符串转换为邻原创 2020-05-18 12:24:56 · 177 阅读 · 0 评论 -
【算法】图 (2) Breath-first-search 宽度优先搜索
States of vertices during traversal(遍历时顶点的状态):Undiscovered:还没遍历到该点 Discovered:遍历到该点了,但是对于该点的操作还没有结束 Processed:操作已结束Predecessor tree(前结点树):parent[],parent[1]=2,表示1的parent(前结点)是2.BFS的本质是借助了队列,DFS的本质是借助了栈(通过递归隐式借助栈)1BFS伪代码BFS-TREE:初始化需要的数据,..原创 2020-05-18 02:15:34 · 674 阅读 · 0 评论 -
【算法】图 (1) 初始化
格式规定:U:undirected 无向图D:directed 有向图W:weighted 有权重的示例:(无向无权重图)U 41 30 21 0该图的邻接矩阵:该图的邻接表:输入样例:graph_string = """\U 171 21 151 612 132 1513 44 5"""1.将上述字符串转换为邻接矩阵from math import infdef adjacent_matrix(...原创 2020-05-18 01:41:05 · 407 阅读 · 0 评论 -
【算法】最长公共子序列 递归 输出结果 优化
主要是如何输出结果的字符串,而不是简单的最长的公共序列的长度。这里的1+LCS(...)表示每次在数值上累加! 这里的比较max(value1, value2)表示对数值上的大小进行比较!这里的s1[i]+LCS(...)表示在字符串上的累加! 这里对len(str1)和len(str2) 是对str1和str2的(结果字符串)的长度进行比较因为上面的递归 会导致重复的计算...原创 2020-04-06 13:14:06 · 341 阅读 · 0 评论 -
【算法】dynamic programming (2)最长公共子序列:递归(自顶向下)+备忘录+输出结果字符串、编辑距离,加权编辑距离
1. 递归+备忘录的方式写LCS不允许使用for和while循环1.1 只输出最长的值1.2 使用备忘录memo = [[0 for j in range(len(s2)+1)] for i in range(len(s1)+1)]def LCS(i, j, s1, s2, memo): if i >= len(s1) or j >= len(s2)...原创 2020-04-03 13:19:05 · 895 阅读 · 0 评论 -
【算法】动态规划(1)
dbq我又开始学算法了 这次是 毫无压力的学 我觉得很开心~以下都来自于的humble opinion~在DP中,递归是top-down,填表是bottom-up.我之前一直都没有搞懂过,自顶向下和自底向上的区别;(可能我现在的理解也有问题 再说)自顶向下,就是站在了顶层去思考问题,比如说递归,你只需要给出一定的递推公式,然后从顶层去解决问题,细节的部分(你要考虑)但是不会体...原创 2020-04-01 12:09:01 · 301 阅读 · 0 评论 -
挑战程序设计竞赛 (优先队列) POJ 2431 & 3253
POJ 2431 Expedition点击这里 查看题目真的自闭,一个晚上写一道题。就是不知道哪里WA了,最后发现题目没有说一定是顺序输入的加油站(stop),所以在具体实现的时候需要先sort一下。/微笑出错点The first integer is the distance from the town to the stop; 2至N+1行给出的第一个数值是距终点(town)的...原创 2019-04-19 21:35:47 · 196 阅读 · 0 评论 -
挑战程序竞赛 (并查集) POJ 1182 & 2492 & 1703
POJ 1182 食物链点击这里 查看题目我感觉我学过的并查集一下子看不懂了。总之不是简单的并查集,而是种...种类并查集?简单来说就是基本的并查集只需要判断两个是否属于同一组,而种类并查集则需要判断两个个体之间的关系(同一组?你吃我?我吃你?)推荐一个题目详解博客:Click HERE解题思路:总之我写题解也是为了给自己以后好复习,这里让我茅塞顿开的一些提示:两个个体x和...原创 2019-04-22 19:19:59 · 289 阅读 · 0 评论 -
PAT 1019. 数字黑洞 (20)
交第一遍的时候被测试点2卡住了,后来才知道还有关于位数小于4位的数,存在数组里的问题没有处理。#include #include using namespace std;bool cmp(int x, int y) { return x > y;}void deal() { int n; cin >> n; int x = n, i = 0, y = 0; if原创 2017-05-24 11:13:39 · 785 阅读 · 0 评论 -
分苹果
题目描述:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法? (5,1,1)和(1,5,1) 是同一种分法。输入:第一行是测试数据的组数n。 以下每行均包含二个整数M和N。输出:对输入的每组数据M和N,用一行输出相应的K。 样例输入27 33 2样例输出82思路分析:f[m][原创 2017-05-15 19:48:47 · 207 阅读 · 0 评论 -
穿越矩阵(15分)动态规划
题目内容:现在有一个 m * n 的整数矩阵,请你编写一个程序计算出一条从左到右穿过矩阵的路径,并使此路径的费用最小。路径从矩阵的左侧的第一列的任意单元格开始,逐步穿过矩阵到达最右侧的一列的任意单元格。每一步是指从某单元格进入它一列的相邻单元格(如下图,可以是横向或斜向)。矩阵的第一行和最后一行实际是相邻的,你可以想象矩阵是包裹在一个横放的圆柱体外面(这点很重要)。路径的花费是指这条路径...原创 2017-11-04 10:00:55 · 429 阅读 · 0 评论 -
尼姆博弈(Nimm's Game) 取石子
题目内容: m堆石子,甲乙两人轮流取,每次需先选择1堆,并取任意数目的石子. 最后取完者的获胜.规定甲先取。输入描述可能有多组测试数据。每组的第一行是m,第二行是m个整数,表示每堆石子的数目。输出描述:每个测试用例,甲失败则输出“No”。否则输出"Yes",并在下面的行输出取法。按堆号顺序输出各种甲能取胜的首次取法a,b,表示在第a堆石子中取完石子后剩下b个,甲可以原创 2018-01-27 15:02:22 · 528 阅读 · 0 评论 -
邮差送信(15) BFS
题目内容:有一个邮递员要在n个城市之间来回送信。但有的城市之间有大路相连而有的没有路。现在要由一个城市到另一个城市送信,中途最少要经过多少个其它的城市呢?输入描述第一行是n,k(1输出描述:输出从城市p到城市q之间最少要经过的其它的城市的数目。如果p和q之间不连通则输出0输入样例6 61 41 22 33 45 45 61 6输出样例2AC代码:#include #include using原创 2018-01-19 14:48:13 · 634 阅读 · 0 评论 -
泊松分酒(15)
题目内容:有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。下面的列表是可能的操作状态记录:12,0,04,8,04,3,59,3,09,0,31,8,31,6,5每行3个数据,分别表示12,8,6升容器中的油量第一行表示初始状态,第二行表示把12升倒入8升容器后的状态,第三行原创 2018-01-19 19:44:16 · 1027 阅读 · 0 评论 -
2016年第七届蓝桥杯C/C++程序设计本科B组省赛 凑算式(结果填空) DFS
//A + B/C + DEF/GHI = 10 凑算式 标记一下1-9个数,再搜索一下就好了#include <iostream>using namespace std;bool visited[10];int ans[100];int k = 0;int coun = 0;bool judge(){ double x = (double)ans[1]/ans[2];...原创 2018-03-23 09:32:17 · 382 阅读 · 0 评论 -
PAT乙级 1079. 延迟的回文数 (20)
#include <iostream>using namespace std;int n;//数的长度有在加的过程中变化 bool isPalindrome(int a[]){//判断是否是回文数 int mid = 0; if(n%2 == 0) { mid = n/2-1; for(int i = 0, j = n-1; i <= mid &...原创 2017-12-15 19:38:40 · 251 阅读 · 0 评论 -
1078. 字符串压缩与解压 (20)
#include <iostream>#include <string>using namespace std;string a;void deal1(){ getline(cin, a); for(int i = 0; i < a.length(); i++) { int count = 0; while(a[i] == a[i+1])...原创 2017-12-15 19:43:18 · 1772 阅读 · 0 评论 -
拓扑排序
一句话解释:以次输出入度为0的点题目内容有N个比赛队(1<=N<=500),编号依次为1,2,3,…,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。输入描述输入有若干组,每组中的第一行为二个数N(1<=...原创 2019-03-23 16:52:41 · 135 阅读 · 0 评论 -
单调递增子序列
前言:最长公共子序列子序列可以不连续,但是有先后的次序关系.为啥不能使用暴力解决这个问题:设A串长为n, B串长为m。A串子序列个数, B串子序列个数, 针对每一种情况进行匹配,时间复杂度变为: .所以利用动态规划:A = {a, b, c, 1, 2, 3, a, b, c}B = {1, 2, 3, a, d, c}定义状态:dp[i][j]: A串第i个位置,B串第...原创 2019-03-23 22:11:34 · 2250 阅读 · 0 评论 -
dijstra邻接矩阵和邻接表
问题描述所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车。输入描述输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之...原创 2019-03-23 22:31:50 · 299 阅读 · 0 评论 -
单源最短路径(Dijkstra算法)
题目内容: 有5个城市(A,B,C,D,E),其中每个城市到其他城市的直达距离已知,两个城市之间只有一条公路。计算从城市A到其他任意城市的最短路径距离。输入描述4行数据, 第一行是A到(B,C,D,E)的直达距离,第二行是B到(C,D,E)的直达距离,。。。,第4行是D到E的直达距离。输出描述A城市到(B,C,D,E)的最短距离。原创 2017-10-20 10:46:53 · 411 阅读 · 0 评论