自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(92)
  • 收藏
  • 关注

转载 分数组(思想很重要)

分数组可以认为是枚举子集问题可以枚举出所有的子集,然后判读这个子集和他的补集是不是最小的哪一个但是没有必要这么做,因为可以在枚举子集的过程中进行剪枝下面是代码:代码中有详细的注释,里面有很多东西值得学习while(cin>>s)以及在DFS中每一条语句代表什么意义排序对于枚举子集是很重要的,可以方便剪枝//分数组,使用回溯法,枚举子集#in...

2019-03-12 15:51:00 178

转载 给出前序和后序,计算可能的树的种类

第一注意整数溢出的情况第二,递归函数的含义要非常的明确,这样才能真正明白它的含义,以及确定出边界条件第三,如果一个指令有可能不执行,那么要放到循环体的里面去下面是代码#include<iostream>#include<string>using namespace std;typedef unsigned __int64 ULL...

2019-03-11 18:43:00 199

转载 最长连续公共字串

注意与最长公共子序列的不同还是对状态的定义不是很了解#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100 + 10;char line1[maxn];char line2[m...

2019-03-11 15:57:00 139

转载 大整数类的实现,包括乘法加法和减法

需要注意的是,BASE一定要用LL,在vc中是__int64下面是代码:代码里面会有详细的注释:#include<cstdio>#include<iostream>#include<vector>#include<string>using namespace std;typedef __int64 LL;...

2019-03-11 11:17:00 385

转载 多叉树的建立(非常重要)

多叉树的建立是以前没有遇到过的可以有这样的一个数据结果一个结构体:里面保存一些这个节点的信息,以及定义一个vector,vector里面是孩子的信息,既可以是数组实现的动态分配的节点编号,也可以直接在里面装容器。注意:在函数里面如果要使用一个结构体的话,必须要加&符号!!!还有一点,如果要想对某一些特殊的元素做比较的话,最好不要使用cmp,而直接使用结构体中...

2019-03-10 17:24:00 1987

转载 string的find函数

string的find函数找不到"\"转义字符,需要再添加一个"\\",这样就可以找到了#include<cstdint>#include<string>#include<iostream>using namespace std;int main(){ string s1 = "`1234567890-QWERTY...

2019-03-10 12:01:00 474

转载 带权图带圈图的最短路算法dijkstra算法

重#include<cstdio>#include<vector>#include<queue>using namespace std;const int maxn = 100;const int INF = 1<<30;struct edge{ int from,to; ...

2019-03-09 21:59:00 212

转载 最小生成树kruskal算法

关键在于并查集的使用#include<cstdio>#include<vector>#include<algorithm>using namespace std;const int maxn = 100;struct edge{ int front,end; int value; boo...

2019-03-09 17:50:00 74

转载 计算带有括号的表达式的值

关键在于寻找括号#include<cstdio>#include<cstring>using namespace std;const int maxn = 100;char s[maxn];int left[maxn],right[maxn];char node[maxn];int cnt = 0;int newno...

2019-03-09 17:10:00 115

转载 无根树转有根树

#include<cstdio>#include<vector>using namespace std;const int maxn = 100;vector<int>G[maxn];int p[maxn];void dfs(int x,int root){ for(int i = 0;i <...

2019-03-09 16:11:00 67

转载 UVA225

注意两点,如果想要让字典序输出,那么选择的时候,就按照字典序来选择就可以了第二点:这种有明显的阶段的使用DFS更自然一点(比如树也是这样)#include<cstdio>#include<set>#include<queue>#include<algorithm>using namespace std;t...

2019-03-08 21:41:00 85

转载 UVA208回溯法水题

枚举所有可能的路径要注意的是:1》并查集判联通2》如果一个点的下一个点就是goal,那么当直接判断出来后,不能够直接返回,应该去continue下面是AC代码#include<cstdio>#include<cstring>using namespace std;const int maxn = 30;int G[max...

2019-03-08 19:50:00 84

转载 埃及分数问题(迭代加深搜索)

这题其实和回溯法是一样的,只不过剪枝的判断不一样了一点这种方式的剪枝只有两种,第一种是,如果在给定的深度上全是最大的数字,也还是达不到要求,那么剪枝另一种剪枝是超过了深度也同样要剪枝所以在同一层中,枚举的上下界就是:比前一层枚举的那个数要小,下界是必须足够大,以至于这个深度都使用这个数,就超过了给定值还有一点要注意的就是返回值的问题:如果这一层有一个分支成...

2019-03-08 15:56:00 158

转载 UVA1601万圣节的早上

此题非常经典,确实学习到了很多的东西;路径搜索这种类型的题目步骤是这样的:第一保存状态第二寻找状态之间的关系,即一个状态能够走向哪些状态第三判断这个新产生的状态是否已经走过。scanf("%d%d%d\n");后面加\N,下次读的时候就可以换行读,和fgets配合起来很好用如果开数组可以把所有的状态都包含进来的话,那么就可以去开数组学到的东西...

2019-03-08 14:27:00 116

转载 UVA10375将数字表示为素数的乘积

这题展示了将某个数字展示为素数的乘积的方式本质上和分子和分母同时除以各自的最大公约数类似,但是速度比他们快多了下面附上代码://汝佳大佬的暴力解法,将某个数字表示为素数的乘积,按照素数的系数来求解//我一开始想的是使用在一开始看到的那样,分子分母约去最大公约数,但是这样是不行的,因为数字太多了//不过反过来一想,之前的使用最大公约数的方式也可以使用这道题的素数法...

2019-03-07 19:05:00 120

转载 UVA12169模运算

使用了模运算后,数字的范围不会超过模这道题目可以首先估计时间复杂度,由于要枚举a,b,最多有100000000种情况,而每种情况最多需要计算T次,基本上算是一个o(N)的算法,时间上足够了//我自己的思路是枚举所有的a 和 b//原来汝佳也是这么做的#include<iostream>#include<cstring>using ...

2019-03-07 17:51:00 84

转载 UVA11582巨大的斐波那契数(模运算)

这道题目主要就是模运算的各种性质有以下几个注意要点:MOD1运算都是0;乘法的模运算应该注意溢出的情况,即如果要求两个数的mod,如果有可能溢出的话,那么先对两个数都取模,然后再对乘积取模大整数取模幂取模的高效算法在这道题目中有一个需要注意的点,那就是为什么开始循环的时候一定是从F[0]F[1]一样的数循环呢?我们可以假设从别的地方开始循环的即从F[I]...

2019-03-07 17:10:00 113

转载 高效筛选法

先实现高效的素数筛选法然后再暴力的无平方数筛选法然后再高效的平方数筛选法bool vis[1000000 + 5];//首先实现最高效的素数筛选void creat_primer_table(int m){ for(int i = 2;i * i <= m;i++) { if(!vis[i]) {...

2019-03-07 14:53:00 157

转载 欧几里得算法和唯一分解定理

#include<iostream>using namespace std;//辗转相除法int gcd(int a,int b){ return b == 0? a:gcd(b,a%b);}//判断一个分数形式的数是否是整数//分子上是众多的整数相乘的结果//利用唯一分解定理,只需要去判断最后的X[2]是否为1就可以了i...

2019-03-07 14:00:00 48

转载 UVA11584划分回文串

这题一开始的思路是:枚举所有子集,判断各个子集是不是回文串。但是很显然只能解决规模为10以下的所以需要使用dp对这类问题的感觉就是,新加的哪一个元素,对所有的前面的东西都有影响,所以称为最长上升子序列问题的类似题目下面是AC代码://思路有两个//第一个是枚举所有子集,判断哪些是回文串//日狗,又他妈是枚举所有的子集//当然还有另外一种方式//d[...

2019-03-06 17:30:00 134

转载 UVA11400照明系统设计

这题怎么说呢?对他是如何想到这种方式不是很理解我只能挑着说一下我的一些理解:首先来说一下为什么必须是全换的:分为两种情况:第一种情况是:更换的高电压的灯泡的价格更低,那这个没什么好说的,肯定得换,因为换一半的话,由于还可以继续换,继续省钱,所以必须得换第二种情况是:更换的高电压的灯泡的价格高,这种情况下,如果换到中途不换了,那么成本绝对是增加的,因为在这种情况下的最低...

2019-03-06 16:22:00 94

转载 最长上升子序列问题/最长公共子序列问题

这个时候边界不是很好确定,所以可以使用记忆化搜索比较容易一点需要注意的一点是:更新状态的时候,一定要使用dp(x),而不是d[x]#include<cstdio>#include<algorithm>using namespace std;int A[] = {0,1,5,2,6,8,7};int B[] = {0,2,3,5,...

2019-03-06 14:28:00 84

转载 硬币问题

硬币问题有可能是无解的定义状态d[i] 从i减到0的最少使用的硬币数可能会无解下面是代码//主要问题有:矩阵嵌套问题一开始调用solve(i)的i是怎么确定的?//可以认为是任意一个点吗?//可以认为是任意一个点?//那么如何定义状态?//状态的定义与实际的情况是有关的(有向边是从大到小还是从小到大),但无论怎么,最后的值应该是要打印的那一边的值/...

2019-03-06 12:06:00 97

转载 UVA12563(两个权值一起考虑)

这道题目可以套用0-1背包的模型,其中剩余时长-1就是背包的总容量,而在这些时间内,能唱的最多的歌曲数,就是背包问题的重量cnt[i][j]的定义就是在时长还剩下j秒的时候,在前i首歌中挑选,最多能够唱几首但是值得一提的是,这里面还有另外一个权值,就是时长;即如果能唱的歌曲数相同,挑选时长最大的。值得一提的是,如果不用去管cnt,只去管能唱的时间长度,那...

2019-03-06 11:26:00 96

转载 0-1背包问题

重点还是在状态推荐使用的状态定义是:d[i][j] 往容量为j的背包里面放前i个物品的最大总重量求任何的动态规划的题目都可以使用记忆化搜索和递推法使用递推法必须倒着计算,即每次计算所需要的参数都必须算出来下面附上我写的代码#include<cstdio>#include<algorithm>using namespace std;...

2019-03-06 10:01:00 63

转载 UVA116

如果上交复试的题的难度都是这个水平,那么就好说了,但这个题确实简单了点重点在如何打印字典序的地方//这题应该还算比较的容易的//思路还是先定义状态,d[i][j]代表当前点的距离最后一列的的路径的最小整数和//状态转移方程就是d[i][j] + A[i][j] + min(右上右下右)//如果要输出字典序,那么就还需要一个next矩阵,来记录每一个状态的下一步...

2019-03-05 21:53:00 86

转载 UVA437矩形嵌套的立体版

题目不说了,其实还是很简单的,只需要再去处理一下如何表示顶点就可以了。但这个里面有一个值得探讨的小细节,就是如果输入的长方体有相同的边,那么在顶点里面不就重复了吗?不过好在在这道题目中,有相同的点并没有什么影响,因为这两个顶点之间根本不存在边还有一点就是,汝佳的代码里面没有建图,可以是可以,但是那样的话,对编写代码的要求又提高了一些,但是时间效率并没有差很多...

2019-03-05 19:51:00 59

转载 UVA1025简单的DP问题

这个题目其实还是很简单的,属于入门级别的动态规划这道题的特点有如下几点:第一:起点固定,终点固定第二:在理解题意的时候,应该要理解到,如果有解,那么在T时刻,这货一定是在第n个station的。如果没有解,那么一定是第一趟从起点出发的列车在T之前走不到终点。第三:虽然在列车上时,这货所在的位置也是能够确定的,但是这样就会带来很多的麻烦,不如直接忽略掉这部分。下面是我使...

2019-03-05 17:08:00 145

转载 数字三角形问题

数字三角形问题是DP的经典入门问题一共有三种计算方式:直接递归计算(有一点回溯法的味道)递推计算记忆化搜索其中记忆化搜索和直接递归计算非常的相似,只不过记忆化搜索将之前计算过的某些部分记录了下来,供以后使用。但是直接递归以前算过的依旧还是要算下面贴上代码:#include<cstdio>#include<cstdlib>#inc...

2019-03-05 11:32:00 177

转载 嵌套矩形问题(有向无环图的最长路径)

只说需要注意的几点:第一点,图必须是联通的,或者说,只求一张图中的一个联通子图,因为如果求了多个联通子图,输出的时候,并不知道d[]中包含的是哪一个子图的距离第二点,d中,无解和有解需要分开,比如说,一张图是非联通的,求完其中的一个联通子图之后,肯定会有一些点没有涉及进来,这个时候,这些点的d中存储的内容应当能够和其它有结果的分辨开,比如没有涉及的点是-1,涉及到的点中的终点是0...

2019-03-05 09:46:00 95

转载 八数码问题的SET实现与哈希实现的比较

紫书上称这个方式为路径寻找问题,实际上,这个就是一个BFS和一个节点查找表的结合这里先采用STL中的set和hash表来实现查找表实现hash的时候也是使用的利用数组进行动态创建在这道题中学到的东西主要是:memxxxx等一系列内存管理函数的使用首先是memxxx(a,b,size)a是一个地址,b也是一个地址,size就是从这几个地址开始的几个字节...

2019-03-04 19:50:00 119

转载 UVA1354枚举二叉树

枚举二叉树的方式有很多,其中一种方式就是每次从一个集合中挑选两个点出来,一个做左子树,一个做右子树,直到集合中只剩下一个节点位置那么问题就在于如何挑选?因为必须创建节点加入集合当中去。我一开始的思路是使用vecoter,每挑选一个就删除一个,并把新创建的节点加入到vector中去。但是这种方式是行不通的,因为当回溯的时候,vector不可能恢复原样。所以使用的方法只能是...

2019-03-04 16:34:00 186

转载 UVA140回溯法剪枝剪多少的讨论

一般认为,回溯法嘛,当然剪枝剪的越多越好了。但是有时候,如果剪枝所使用的判断方式十分繁琐的话,有时候不如不剪这个枝,而只抓住哪些容易剪的,对结果影响大的来剪枝。这道题就是个很好的例子:这道题的思路是这样的,枚举全排列,然后计算其带宽,在枚举全排列的时候,可以剪枝。在枚举非可重集的全排列的基础上,还可以再去剪枝,主要有两种剪枝的方式:第一种是:每放置一步,就判断这一步放...

2019-03-04 13:47:00 106

转载 UVA129 回溯法(非常重要)(避免不必要的判断)

在之前见过的回溯法中,基本上都是在枚举数字的排列,直到没有解为止,没有要求其中的某一个解的情况此题就是要在这一系列解中,求出第n个解这就涉及到了如何返回的问题先来看代码://这道题我的思路是首先按照字典序来构建字符串//但是如何判断是否有重复的字串值得学习//即:只需要判断当前加上的这个字符是否造成重复字串即可#include<cstdio>...

2019-03-04 10:11:00 189

转载 UVA526 回溯法的使用,素数的构造

此题明显是一个回溯法但是要注意的是,这道题也可以使用STL中呢next_permutation,来枚举所有的排列,然后一个一个判断但是速度明显要比回溯法慢了很多。还有一点就是素数的判断方式下面附上AC代码://这道题我的想法就是枚举排列,第一位一定是1,然后又n-1步,每一步需要判断和前一位的和是不是素数,最后一位还需要和1判断一下//另外还需要去判断一个数是...

2019-03-03 23:00:00 88

转载 从八皇后问题看回溯法

八皇后问题是入门回溯法的经典问题,本文借用八皇后问题来阐述一下笔者对于八皇后问题的一些看法。在我看来,回溯法有点像高中时候的排列组合,都是可以在有限的步骤中完成,而每一步有只有有限的选择,这句话也构成了回溯法的核心。每一次成功的放置,代表着解答树上某一个节点的产生:下面结合八皇后问题来描述先来看代码//回溯法用于可以在有限的步骤中得到结果,而每一步又只有有限次的选择的...

2019-03-03 20:58:00 46

转载 求子集的三种方式的总结

求自己总共有三种方式:增量构造位向量二进制首先假设集合A中有n个元素,而且是非重集,一个下标唯一对应一个元素,那么求A的子集就变成了求0~n-1的子集。这个思想对于所有的三种方式都是通用的。第一种增量构造法的思想是,每一次都从0~n-1中挑出一个元素来,每挑一次,就是一个集合。然后再挑元素进入这个集合,但是这次挑选元素的时候,必须比之前的那个元素大。下面是代...

2019-03-03 18:35:00 1928

转载 三种求全排列方式之比较

一共有三种求全排列的方式:第一种就是只适合用于非可重集的DFS实现第二种就是可以用于可重集上的刘汝佳书上的代码第三种就是STL中的next——permutation在对这三种方式做了比较之后发现:DFS实现的效率最高,当n = 10的时候耗时才不到2s,但是n = 11的时候耗时14s这是因为在求排列的时候DFS没有去判断这个元素在集合中是否重复的出现过,只...

2019-03-03 17:03:00 163

转载 UVA10976确定枚举的范围

这道题我的想法就是,先找出两个相同的来,如果没有就一大一小也可以然后再去寻找的是就是将分母比较小的那个-1,去寻找有没有可以和它相配的另一个数来看看汝佳是怎么写的吧其实我之前的思路是有一点问题的,如何表示一个分数?难道是用小数来表示吗?但是浮点数里面的小数是有误差的啊所以汝佳大神直接将分数转换成了整数进行计算另外还有一点值得学习的是,如何求出整数x的过程我之前想的是从2*y一直往上增1,...

2019-03-03 16:54:00 109

转载 UVA11059枚举最大乘积

这道题的主要考点有两个,一个是枚举起点和终点,一个是int以及longlong的取值范围;其中int的取值范围是2亿即 2*10^9, uint 取值是4*10^9longlong的取值是是9*10^18unsigned long long 的取值范围是18 * 10 ^18.超过以上范围就需要去使用大数了而且需要注意的一点就是,与使用longlong类型变量配套的...

2019-03-03 14:41:00 82

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除