acm
Frank(Zhiyang-Dou)
A Ph.D. candidate at HKU. Mainly focus on CG.
展开
-
子集生成——二进制方法与递归方法
二进制方法:#include <iostream>#include <vector>using namespace std;int n ;vector<string > con;void get_sub(int input) { cout << "{ "; for (int i = 0; i < n; ++i) { if (input & (1 <<原创 2017-11-09 22:19:10 · 803 阅读 · 0 评论 -
c++ STL list遍历器使用方法
以int类型的list为例:使用迭代器输出:list<int> con; //声明一个listlist<int>::iterator it; //声明一个迭代器for(it = con.begin();it!=con.end();it++){ cout << *it <<endl;}使用迭代器删除指定值:list<int> con; //声明一个li原创 2018-01-06 12:58:45 · 27894 阅读 · 2 评论 -
Dijkstra迪杰斯特拉算法代码基于链表与小根堆minheap
其实按照萨尼的《数据结构、算法与应用》中的说法 这两种实现方式都用到了优先队列。 这里只是选择使用list链表(严格来说应该叫做“无序链表”)实现优先队列还是选择使用堆来实现时优先队列的区别。使用list的实现第一个是使用list实现的。 复杂度是O(n^2)基于list的复杂度分析每次从链表中取得并删除最小的值需要O(n);对于整个程序而言该操作执行O(n)次所以是...原创 2018-01-06 13:05:11 · 794 阅读 · 0 评论 -
堆的实现及其初始化 c++支持循环更新
代码说明实现基于数组,这里使用的不定长数组。 编号从1开始,当然从数组0位开始也可以。 为了验证代码的可靠性,在main方法上方编写了测试器支持操作(基于模版类) 插入 得到最小值 删除(根) 层序输出 theta(n)复杂度的建树操作: 循环更新堆 删除指定节点循环更新堆说明这里其实就是把插入和删除操作合并在一起了。 作为最小堆,如果更新的原创 2018-01-06 15:34:33 · 652 阅读 · 0 评论 -
由中缀表达式求后缀、前缀表达式cpp代码
前缀中缀后缀定义一个表达式树。前序遍历得到前缀,中序遍历得到中缀,后序遍历得到后缀。单纯的中缀表达式会引起计算歧义,所以为了计算一般要完全括号化;或者将中缀转换为前缀或者后缀。注意:前缀和后缀没有歧义。由中缀求前、后缀的区别不同1:优先级比较函数不同在中缀求后缀时,我们定义的优先级比较为: 如果扫描到的运算符比栈等的优先级高(且不相等),那么将该运算符直接入栈,而不对栈进行操原创 2018-01-07 16:58:47 · 1133 阅读 · 0 评论 -
前序后序中序遍历非递归实现
前序非递归实现void pre_show2() { if (root == 0) return; stack<Node<T> * > con; Node<T>* t = root; con.push(t); while (!con.empty()) { cout << t-原创 2018-01-08 16:08:02 · 372 阅读 · 0 评论 -
C++ cin\cout关闭同步
首先说明:不关闭同步的话scanf与printf明显更快一些。关闭同步cin cout与printf和scanf几乎相同。关闭同步的语法:using namespace std;ios::sync_with_stdio(false);...原创 2018-01-18 11:06:24 · 10081 阅读 · 2 评论 -
基于bellman-ford算法与spfa算法判断负环
概述spfa是基于bellman-ford算法(以下简称bf算法)改进的。也即将bf算法放入队列实现。说明当然bf算法还有一种优化方法就是。在外层循环k时,如果发现在构造新的一层路径生成树时整个树没有更新。这样可以直接跳出。具体实现可以在循环中加一个flag判断一下。 文字基于您已熟知spfa以及bf算法。负环判断方法1.bf算法更新完状态数组后,再遍历边集,如果对任原创 2018-01-18 11:14:54 · 999 阅读 · 0 评论 -
OpenJ_Bailian - 4117简单的整数划分问题-递归&动态规划
简单的整数划分问题 https://vjudge.net/problem/OpenJ_Bailian-4117递归法定义函数f(m,i); m为要凑的数,i是第i个使用的数递归分析基础部分:如果m为0就是只有“一个”方案:谁都不取。 如果n为零没有数了谁都凑不了/if(m==0){return 1;}if(i==0){return 0;}原创 2018-01-18 12:16:18 · 838 阅读 · 0 评论 -
后缀数组-SA\height详解
综述最近在做字符串的相关工作。现阶段主要学习的是后缀数组。相比较后缀树,后缀数组的性能略差但是由于编写方便。在信息学竞赛中,性价比很高。 本篇文章主要介绍SA和height数组的求解方法。由于时间原因,一步一步介绍。 网上关于SA的介绍很多,而且非常好懂。但是对于height数组的介绍不是很到位了。所以,本次首先介绍height数组的求法。编译器sublime介绍实...原创 2018-04-16 16:36:42 · 2673 阅读 · 0 评论 -
霍夫曼树(Huffman tree) 编码及解码——小根堆的应用
霍夫曼树原理简单介绍霍夫曼树本质是一种贪心的思想,他是按照编码过程中每个字符出现的频率进行无前缀的编码。即:对给出的n个字符和其出现频率,每次在小根堆取出出现频率最低的字符(当然还要删除该两节点)作为一个新节点的左右子树,然后该新节点再放入小根堆。不断重复上述操作,知道小根堆只有一个节点,此时就建成一棵二叉树了。不难看出只有每个叶子中才有字符,而该叶子中的字符对应的编码就是从根到他的路径。预备知识1原创 2017-12-30 22:47:24 · 1527 阅读 · 0 评论 -
HDU1213并查集解题报告
裸题不解释了。#include <iostream>#include <string>#include <set>#define maxn 1024int con [maxn];using namespace std;int res = 0;int fu(int p) { if (con[p] == 0) { return p; } re原创 2017-11-27 20:40:38 · 412 阅读 · 0 评论 -
全排列——递归方法
与网络上大多数方法相比,该方法可以处理 [1 1 1]重复生成的问题 -》c采用set#include <iostream>#include <vector>#include <set>using namespace std;int n = 0;vector<string> con;set<string> res;void resprint() { for (set<stri原创 2017-11-09 22:21:46 · 428 阅读 · 0 评论 -
S-Tree解题报告UVa 712二叉树/二分搜索
acm解题报告S-Tree UVa712二叉树/二分搜索。刷题的一点小感悟,刚刚入门,希望可以不断进步!原创 2017-10-16 11:09:48 · 447 阅读 · 0 评论 -
C++使用string大数运算——加法
#include <iostream>#include <string>using namespace std;string add(string a , string b ) { string tempa = a, tempb = b; //这个过程是判断一下谁更长,然后我们从短的开始运算 if (tempb.length() > tempa.length()) {原创 2017-10-25 22:07:04 · 2380 阅读 · 0 评论 -
分治思想—递归实现大数乘法ACM(含奇数长度处理)
一般的算法都是O(n^2)这里不再给出。 但是如果使用递归的话复杂度会变为O(n^log3),主要的做法是减少运算次数 对于任意两个数字X,Y 可以将其在中间部分 分解为两部分例如: 1234 -> 12 和 34 5678 -> 56 和 78 (细心的人可能发现就是1234 = 12*10^2 + 34)那么对于任意一个数都可以分解为前后两部分。 我们还是以1234这样的四原创 2017-10-26 09:54:33 · 1132 阅读 · 0 评论 -
基于Strassen算法采用分治的矩阵乘法cpp实现
直接上代码。 注意:只支持维度为2的幂次的方阵相乘。#include <cstdio>#define maxn 50struct matrix{ int con [maxn][maxn]; int size = 0 ; //规定一定是n * n矩阵} m1, m2;matrix add(matrix A, matrix B, int len ) { matrix r原创 2017-10-26 20:35:55 · 977 阅读 · 2 评论 -
Lifting Walls 解题报告 Kattis 暴力求解法
题意: 给出墙的四面的边长,给出 所有 挖掘机的作业半径以及位置。 其中墙的几何中心就是坐标的原点。 需要特别注意的是:挖掘机覆盖的是“墙的边长上的中点” 最后要求的是给出可以覆盖这四个点最少的挖掘机的数目。 解题思路: 这个题目如果通过枚举就是2的n次方,其中n为挖掘机数目。因为每个挖掘机有两个状态:用 或者 不用。所以是指数级,会爆。 考虑另一种暴力求解方法: **实现考虑题目中原创 2017-11-04 21:22:46 · 587 阅读 · 0 评论 -
Fruit Baskets 解题报告 Kattis 暴力求解法
题意: 题目中说了很多废话。其实就是解决一个问题: 给出m个不同质量的物体,并且每个物体的质量大于等于50, 问你在这m个物体中随便取(可以取1个,2个,3个等等),满足取出来的物体的质量和大于200的质量和。 比如给你: 50 60 200 大于200的组合有: 50 200 60 200 50 60 200 对应: 输出 (50+200) + (60 + 200)+(50原创 2017-11-04 21:38:59 · 759 阅读 · 0 评论 -
Tour Guide 解题报告 Kattis 暴力求解法
解题思路: 一共只有8个老人 n<=8 可以全排列枚举 8! 比较一下,哪种用时最少。 计算距离:用坐标计算距离。 #include <iostream>#include <cmath>#include <algorithm>using namespace std;int n;struct Olds//老人们{ double x, y, v, theta;};Old原创 2017-11-04 22:17:01 · 522 阅读 · 0 评论 -
暂存
字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)总体从右向左。 设字符串长度为m1.坏字符shift坏字符是text中的,是遇到第一个不匹配的字符。 case1:如果pattern中有该字符,就找到pattern中最右边的该字符。 case1:如果pattern中没有该字符,就直接you2.好后缀shift原创 2017-12-13 11:34:07 · 242 阅读 · 0 评论 -
C++规范格式读取
综述只是做个备份,最近需要做一些规范化数据读取的操作。代码#include <fstream>#include <iostream>#include <vector>using namespace std;#ifndef N#define N 1000#endifstruct Powerpoint{ int id; int...原创 2018-10-21 20:02:01 · 723 阅读 · 0 评论