![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 70
圆形毕露
技术热爱者
展开
-
POJ 1753 (组合+递归) Flip game 简单易懂的源代码
我的解法不是很难懂,就是暴力得到所有翻棋子的位置,然后再比较最小的翻棋子个数时间和空间我都没有优化,位运算也只用了一个异或 :P本题有三点大前提:1. 所有的棋子只有“翻”和“不翻”两种状态2.翻奇数次次棋子相当于“翻”,翻偶数次棋子相当于“不翻”3.翻棋子的顺序不影响结果,所以本题求组合,而不是排列首先我定义了三个全局变量:int chess[4][4];原创 2014-02-19 13:32:31 · 711 阅读 · 0 评论 -
POJ 2965 (超简单代码47毫秒AC) The Pilots Brothers' refrigerator
本题和POJ1753类似的思路,可以利用搜索或者组合做出来。网上有很多类似的代码,在此不赘述了和POJ1753一样,我们很容易得到3个大前提:1.每一个元素都只有两个状态:“flip”或者“不flip”,这里我用flip代表改变某个元素状态,根据题目提示,将改变同一行和同一列的把手开关2.每个元素flip偶数次相当于状态“不flip”,flip奇数次相当于状态“flip”,被f原创 2014-02-19 14:50:46 · 703 阅读 · 0 评论 -
最短路径算法----Floyd-warshall(十字交叉算法证明)
Floyd不同于Dijkstra,可以得到所有点对的最短路径。使用的是DPFloyd可以处理有负权重边的情况递推公式:w(i, j) = min{w(i, j), w(i, k) + w(k, j)},含义是【i到j的最短距离】=【i到k的最短距离+k到j的最短距离】与【i到j的最短距离】中较小的那一个看起来很简单,但是具体怎么计算呢?依旧使用这个例子,图的表示方式为:原创 2017-05-24 12:25:31 · 3686 阅读 · 0 评论 -
最短路径算法----Bellman-ford和SPFA算法
思路类似Dijkstra,可以处理负权边,还可以发现负权回路。核心也是:对于边e(i,j), 如果w(i) + e(i,j) wiki)对于图有def bellman_ford(graph, start_node): # graph:n*n matrix # find min distance from start_node length = len(graph)原创 2017-05-24 17:10:35 · 790 阅读 · 0 评论 -
最短路径算法----Dijkatra
题目描述:对于上图中某个点i,求其他所有点和它的最近距离适用于:没有负数边的情况;有向图、无向图都可以使用该算法数据结构:可以使用二维矩阵代表图、也可以使用数据结构描述graph算法:用到的数据集合:s(点k到点i最近的距离), u(不在s中的其他点到i的距离)算法描述:取u中距离最近的点j,加入s对于和j相邻的点,更新u中的距离def dijkstra(g原创 2017-05-23 10:58:17 · 918 阅读 · 0 评论 -
最小生成树----Prim算法+loose操作
对于图求最小生成树Prim算法中,有两个顶点集合:v和u,一个边的集合:ev:e中的顶点u:all - ve:存放所有已选的边算法描述:从所有边中取最短的边e(i,j),i属于v,j属于u。将e(i,j)放入e中将j从u中放入v中在写算法的过程中,增加了数据结构waiting_edge,存放所有(v,u)点对def prim(graph): v =原创 2017-05-24 21:26:28 · 427 阅读 · 0 评论 -
最小生成树----Kruskal算法&并查集
对于图寻找最小生成树顶点v使用并查集,初始状态下所有顶点都是一个集合。Kruskal算法描述:取最短的边,比较是否两个顶点都在同一集合内:如果都在,则舍弃初始化时,v长这样v = [i for i in xrange(0, length)] 并(i, j)的操作就是合并两个集合的跟:r_i = find_root(v, i)r_j = find_root(v, j原创 2017-05-25 13:20:24 · 597 阅读 · 0 评论 -
找钱方式:递归,循环的解法
题目:给定一个金额m,以及几种钱币面值(比如1,2,5),求m有多少种找钱方式解答:a(m, c): 金额m的找钱方式,此时最大钱币面值为ca(m, c) = sigma( a(m - k*c, next_c) ); k=0~m/c, next_c=比c小的下一个面值的钱币,比如c=5, next_c = 2按照以上递推式,可以写出递归函数:int exchangeWays(i原创 2014-10-15 12:34:17 · 1529 阅读 · 0 评论 -
找钱方式升级版:求队伍组合
在做游戏匹配算法的过程中,我遇到一个有趣的算法,可以说是“找钱方式”的升级版题目描述如下:已知游戏中一方人数为x个人,组队上限为y人,求满足x的所有队伍组合。比如 x = 3, y = 2结果应该为[{1:3}, {1:1, 2:1}]。就是1个人的队伍3个,或者1个人的队伍1个&2个人的队伍1个;这两种组合可以得到3个人。抽象:com(x) = sigma(f(i原创 2017-05-19 17:33:59 · 393 阅读 · 0 评论