自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 最近图论的总结

这里是一些图的一些基础题目。首先是dijkstra算法,也就是dijkstra求最短路径的问题。这个一般是来解决 一个点到其他点最短路径的问题。具体的做法是,设置一个数组d表示,每一个点到该点的最短距离。edge表示邻接矩阵,d初始化为d[i]=edge[i][v],然后每次找d数组中最小的那个值,并且标记,然后更新d数组,假如新添加了一个k点,则对每一个可以比较的d,去进行d[k]+edge[k][i];然后是floyd求最短路径,这个是求任意两点之间的最短距离。方法是冬二维数组d[i][j]

2021-12-05 22:25:59 366

原创 Floyd 算法 图

FLOYD 方法是求各个点到各个点最短的距离。很显然,从一个点到另外点要不直接到到,要不经过一些点再到,反正头和尾是不变的。#include<iostream>using namespace std;string ver[100];int edge[100][100];int d[100][100];string p[100][100]; int v,a;void floyd(){ int i,j,k; for(i=0;i<v;i++)

2021-11-21 23:30:45 335

原创 Dijkstra 算法

这是图论里面的一部分内容,给你个图,让你求 源点 到其他点的最小值。最短路径的一种具体的思想是,假如要找从v0到那个点距离最短,一定是一步就可以到达的。之后在找距离最短的一定是一步到达,或者到上次找到的距离最短的点 v,再由v到达的那个点,循环n-1次。#include <iostream>#include <string>using namespace std;int edge[100][100];int v,a;int s,e;int vex[10005];

2021-11-21 23:20:21 4550

原创 关于卡特兰数

在之前我们知道了斐波那契数列,在很多的地方都是有类似的规律的。这还有另一组 叫卡特兰数卡特兰数 的第一个模型可以这样表示 第n项=从2n中选出n项的选法减去从2n中选出2n-1的选法。首先从 0 0走到 n n 意味着走n个1和n个0,(1是想上走,0是向右走),而且任意前k个数0的个数要大于一的个数,这个就是模型之一,同样的括号问题也是如此 左括号相当于 0右括号相当于 1.出栈问题也是如此代码实现的话用一个递归就可以 第零项是1 第n项是(4*n-2)/(n+1)乘以n-1项...

2021-11-14 22:58:51 243

原创 全排列问题

最简单的全排列,也是最简单的深搜#include <iostream>#include<cstdio>using namespace std;int a[10000],b[10000];int num;int n;void dfs(int num){ if(num==n+1) { for(int i=1;i<=n;i++) { cout<<" "<<a[i]

2021-11-14 22:42:20 793

原创 9题目总结

,试着用dfs写了下n皇后的问题,dfs与前面学习的bfs有相似的地方,但是dfs的代码更简单和方便。dfs是深度搜索,一直向下走走到最深处,走不下去了再回溯上一个。相较于上一个bfs的代码只需要把bfs改为dfsdfs代码为void dfs(int dx,int dy){ room[dx][dy]='#'; num++; for(int i=0;i<4;i++) { int newx=dir[i][0]; int newy=di

2021-11-08 00:33:29 54

原创 2021-10-31

最先再看哈希发现还没弄很明白,有点恶心;先整理一下这几天看的首先是一个小的字符的处理讲一个字符串中的 you 全部换成 we#include <bits/stdc++.h>using namespace std; int main() { string str; int pos; while(getline(cin,str)) { while((pos=str.find("you")

2021-10-31 22:31:05 114

原创 周末学习总结

这一周主要学习了一些数学问题快速幂问题,矩阵快速幂,这里用到了上学期学到的线性代数然后剩下的就和快速幂的思路差不多还有公约数,公倍数延伸的欧几里得二元一次方程问题然后是同余和逆元的问题之后是打印素数的问题,也是素数表的问题之后就是杨辉三角其实就是二项式展开,斐波那契数列和卡特兰数也算是开拓了一下思路了。在数字的划分这里还有dp的问题。然后就是刷题了,这里做的大多数都是数学的基础题目,也算是开拓思维了...

2021-10-24 23:19:43 123

原创 快速幂的和优化

快速幂大家都了解,a的n次方可以写为,a的平方乘以n的二分之一次方。记得判断n的奇偶int fastpow(int a,int n){ if(n==1) return a; int t=fastpow(a,n/2); if(n%2==1) return t*t*a; else return t*t;}优化的话是这样的比如11转换为2进制 101111=8+2+1int fastpow(int a,int n){

2021-10-21 22:16:02 56

原创 打印素数表

打印素数表,开个布尔数组来判断他的下标 i 是不是素数。方法是先全部初始化为素数,首先2为素数所以2的倍数都不是素数,把其布尔值改为false,然后素数也可以存一个数组里面这样就完成了素数表。void sushub(int n) { memset(s,true,sizeof(s)); int k=1; for(int i=2;i<=n;i++) { if(s[i]) { ss[k++]=i;

2021-10-21 22:00:07 167

原创 10/17学习总结

图的存储首先是我们都了解的邻接矩阵,可用来储存边与边之间的距离,但问题也是很明显的。他太浪费空间了,且复杂度还是n的平方,很明显这个是非常不划算的,这里就可以用链式前向量来储存。const int num=1000005;struct edge{int to,next,w;}e[num];int cnt;void init(){ for(int i-0;i<num;i++) { e[i].next=-1; head[i]=-1; }

2021-10-17 23:33:29 41

原创 10月10 周末总结

这一周反正比上一周学的多。dp方面多的几个题目大多都是区间dp的问题,关于区间dp感觉一般都是三重循环,初始点,区间长度,分开的那个点。然后初始化就要考虑一下特殊地方,比如分成零段的时候和求最大值和最小值时的初始化。然后在此基础上还了解了高精度的,高精度是因为数组储存的范围有限用string处理可以处理的数字更大一点,总结玩模板直接用就可以了。还有是当一个二叉树每个节点都不为空,就比如空节点可以看做一这样的,在dp的时候可以用二维数组来表示,感觉挺神奇的。然后是离散化,是用来缩短长度的,如果是那种很

2021-10-10 20:34:21 50

原创 P1052 [NOIP2005 提高组] 过河

这个dp挺好想的,每次走的位置是知道的,所以走到那个点,就能知道从那个点过来的。然后再分到的这个点是不是石头,如果是石头就总数加一,否则就不变。难得地方是范围的问题。l最大能到一亿,这样的话,就要缩短距离,缩短的话,就离散化。我们只需将每两个石头超过 s×t 的距离缩成s×t就可以了。算是了解了离散化的概念#include<bits/stdc++.h>using namespace std;const int maxn = 150;const int maxl = 300 *.

2021-10-10 20:23:58 90

原创 P1043 [NOIP2003 普及组] 数字游戏

题目题目大意:n个数字围成的环分成m分,每部分的的和对10取模然后各自的乘积求最大值和最小值。看到这个题目我首先想到的是环形的小石子合并的问题,首先的就是把环变成链,这个很简单,把数组复制然后放在后面就可以了。然后是每一段和的问题就可以用到前缀和来表示。初始化的就是求最大值的时候,初始化为一个较小的值,最小值的时候,反之。还有分为零段的时候然后就是dp阶段,三层循环,开始的点 区间长度 断开的位置。dpmax[l][r][i]=max(dpmax[l][r][i],dpmax[l][k]

2021-10-10 20:08:01 274

原创 P1040 加分二叉树

看完之后感觉和之前做的题目有点像区间dp的问题,枚举长度和根节点,左儿子乘右儿子加上根节点就可以了。但不知道怎么来表示这个二叉树和如何保留前序排列这里就去看了看别人的思路,结果连答案都没整明白,没办法就拿纸和笔按照那个别人写的画了一遍,然后就问题解决。用二维数组可以表示这个的二叉树因为空的节点可以用一来表示。#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#incl.

2021-10-06 16:07:52 113

原创 线段树 基本用法和

单点查询#include<bits/stdc++.h>using namespace std;const int maxn=1e6+5;int a[maxn];struct node{int l, r,lazy,val;}tree[maxn<<2];//线段树要开数组的4倍void build(int l,int r,int rt){ tree[rt].lazy=0;//初始化lazy标记 tree[rt].l=l; tree[rt].r=r;

2021-10-04 22:15:09 52

原创 树状数组的应用

树状数组看起来像是二叉树把向一边移一下变成了直角三角形的样子,但实际上,树状数组知识平常的数组而已。如图对于数组里面有几个元素,是根据该数组下标所对应的二进制中最后一个’1’决定的,那个’1’化为十进制后对应的就是数组的个数。具体的求法,对负数的自己 按位与运算。就可以得到int lowbit(int n)return n&-n;而根据树状数组求前缀和的方法为int sum(int i){ int ret=0; while(i>0) { ret+=c[i];

2021-10-03 21:23:06 78

原创 周末总结 9/25

上次比赛做出来的题目还是很少,这一周主要做了之前学的算法较为简单的题目,复习了并查集,简单的dp。然后周末的时候布置了一下任务,因为第一次我们小组布置任务还不是很清楚,就打算在洛谷里面尽量做题,看看一周可以·做出来多少,之后在制定计划。...

2021-09-26 21:31:36 46

原创 hdu 2041 超级楼梯

Problem Description有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?Input输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。Output对于每个测试实例,请输出不同走法的数量Sample Input223Sample Output12#include <iostream>#include <algorithm>

2021-09-22 16:34:07 52

原创 hdu 1863畅通工程

Problem Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。Input测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数

2021-09-22 16:20:38 67

原创 hdu 1233 还是畅通工程

Problem Description某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编

2021-09-22 16:16:17 51

原创 hdu1232 畅通工程

Problem Description某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?Input测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编

2021-09-22 16:13:01 51

原创 hdu 田忌赛马

Description中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?Input第一行为一个正整数n (n < = 1000) ,表示双方马的数量。 第二行有N个整数表示田忌的马的速度。 第三行的N个整数为齐王的马的速度。Output仅

2021-09-22 16:05:54 255

原创 暑假的总结

假期先看了看贪心算法,算是复习了一下吧,把dp的各种东西也都看了一下,并查集是看完了,然后是深搜和广搜,做的题目不多,感觉真遇到这样的题目我还是真的做不出来的。刚刚的比赛让我知道了自己的水平,可以说收到了深深的打击,之后,还是想着继续学下去,努力一下,目标的话就是下一年的省赛,希望加油把。...

2021-09-20 18:45:02 27

原创 hdu 1520 树状dp加 dfs

该题目说的是,给定一个树状关系每个节点都有各自权值,但父节点和子节点只能来一个问权值最大为多少也很简单就分为该节点选不选,如果选了,那么他的子节点就不能选了,假如不选则他的子节点有选和不选两种情况。代码如下#include <iostream>#include <cstring>#include <queue>#include <cmath>using namespace std;const int N=6005;int va[N],fath

2021-08-10 16:19:44 62

原创 暑假学习-dp的硬币问题

你有面值为1 5 10 25 50的硬币,给定金钱n要求换的的硬币数最少,问最少的硬币的数目是多少。比较简单就直接写式子了,dp的式子为 m【i】=min{m【i】,m[i-t[j]]+1}代码为#include <iostream>#include <cstring>#include <queue>#include <cmath>using namespace std;const int N=100005;typedef long long

2021-08-09 22:38:17 84

原创 暑假学习快速排序poj 2388 中的快速排序

快速排序的意思是找一个数作为基准数,一般是最后一个数,然后让i的左边比基准数小,j的右边比基准数大。先让ij为第一个数字,可设置循环j从开头自增,如果第j个数字小于基准数,则i自增。到最后就把基准数和第i个数字交换而poj 2388的题意是给定个奇数,求中位数,用快速排序的方法就是#include <iostream>#include <cstring>#include <queue>#include <cmath>using namespac

2021-08-07 18:24:10 191

原创 hdu 4911 “Inversion” 暑假学习的归并排序

归并排序,是 分治法的一种。具体三步走,是分解,解决合并。意思也就是先分解,然后把小问题先解决,最后合并在一起,解决大问题。这是我看的视频里的图片,感觉说的很清楚。题目说的大体意思是,给出一串数,并给k次操作,每次操作可以把2个相邻的数换位置,求<=k次操作之后,数列的逆序对数最少是多少,因为每一次操作是可以把逆序对数-1的,那么只要求出逆序数对减掉k就可以了,因为数据较大,需要用归并排序来求。先求出逆序对,再跟k作比较,如果交换的次数大于等于逆序对,则交换和逆序对的个数则为零。否则则就是

2021-08-03 22:45:48 83

原创 七月份学习总结和接下来的学习计划

放假也差不多小半个月份了,这一段时间内虽然学习的东西不多,但也多少学习了一些东西,也看了一下关于做题如何应对的技巧,重现看了搜索的dfs和bfs也算是有点收获吧,除了最基础的搜索,了解了向八皇后这样的经典的问题,重新看了一下贪心算法,现在在看dp,因为感觉之前学习的不是很了解。但这几天每天学习时间上不仅少,而且还有点不固定,学起来还好,但老是想着先玩一会在学习,感觉有点像是学习是为了理直气壮的玩游戏一样,最好导致游戏和学习都没整好,接下来希望自己能够好好的学会把,感觉好久没有那种努力的感觉了,希望加油

2021-08-02 21:04:12 66

原创 暑假学习-贪心

这几天又重现看了一下贪心,说实话不是很难,也算是偷懒了吧。在这里简单的总结一下。就是每一步都选择最优解,也就是局部最优解,但是结果不一定是最优解。常见的问题1 活动安排问题 说的是,一天有不同的节目,要看节目必须,从开始看到结尾,问最多看多少的节目。按结束的时间排序,从第一个开始,按结束的时间再去找下一个最早开始的,就可以了。2区间覆盖的问题给定一个长度为n的区间,给出m条线段,问最少用多少条线段可以将整个区间完全覆盖按左端点从小到大排,选在第一个的右端点,去找下一个左区间小于等于右区间,且长

2021-08-01 23:27:53 36

原创 暑假学习-二叉树

二叉树有点类似我们所认识的树状图,可以清楚的查看层次关系。首先由根节点开始,最多由左节点和右节点,一次下去。二叉树一般用指针来表示struct node{ int value; // 根节点 node *l,*r; node(int value=0,node*l=NULL,node * r=NULL):value(value),l{l},r(r){};};通过表示根节点和左右节点,用来表示树。而二叉树的遍历,可分为两大类,宽度优先和深度优先这里只说深度优先的遍历深

2021-07-29 23:40:34 105 1

原创 暑假学习-并查集的问题

这几天看了并查集,感觉这里面解决的问题,就挺生活的,比较有意思。比如,a和b是朋友,b和c朋友,d谁都不认识。认识的人做在一起,不认识的人在一起,问能做几个桌子,很明显这个a b c坐在一起,d单独做一起。我们要解决的就是类似的问题。首先先初始化,可以开一个数组,对应的值就是自己听命谁,开始自己数组装的值都是自己,合并的话就把要和并数组和并在一起。可以知识单纯的合并两个元素,找到各自的根节点进行合并。代码如下#include <iostream>#include <cstring

2021-07-27 14:57:40 50

原创 暑假学习-dfs和dfs应用n皇后的问题

dfs与前面学习的bfs有相似的地方,但是dfs的代码更简单和方便。dfs是深度搜索,一直向下走走到最深处,走不下去了再回溯上一个。相较于上一个bfs的代码只需要把bfs改为dfsdfs代码为void dfs(int dx,int dy){ room[dx][dy]='#'; num++; for(int i=0;i<4;i++) { int newx=dir[i][0]; int newy=dir[i][1];

2021-07-25 11:58:29 91

原创 暑假学习-BFS

之前在学校学习过bfs,但没有完全的掌握,这次通过这两天的学习,有了一些新的认识。首先是bfs走迷宫的问题,说的是一个长方形,有红色和黑色的瓷砖,只能站在黑色瓷砖上移动,给出初始的位置,问能移动的瓷砖个数有多少。这个问题用队列来做,会很方便,因为当前位置用完就标记上“来过了”在之后的搜索中就用不到了。#include <iostream>#include <cstring>#include <queue>using namespace std;char ro

2021-07-23 22:20:35 66

原创 暑假学习-对题目和排序算法的新认识

由于今天书本到了,通过今天的读书也算是有一点收获,在这里总结一下自己的心得。(1)首先是,提供了一种新的思路,在之前做cf的题目的时候,有的时候会遇到题目给出的样例都可以过,但代码wa的情况,找不到更多的样例来测试自己的代码。这里给出了一些的思路,用暴力的方法写出来,通过这个暴力的方法来获得更多的样例,这也是一种解决的方法。感觉这个方法适用于暴力解决会超时,而且自己是真的想不明白的时候在使用。(2)然后是对排序算法有了新的了解,之前我们了解的冒泡排序,这个复杂度是 n方 ,一般不用。经常用的是sort函

2021-07-21 22:03:43 43

原创 2021/5/22学习总结

map的实际应用二分查找最大的最小值最小的最大值打素数表和查找map的应用问题描述:n个数串,如果是第一次出现则输出ok,否则输出该字符串和出现的次数解题思路;使用map(用字符串做下标,记录出现的次数),然后直接暴力求解就可以。代码如下:#include <iostream>#include <map>#include <cstring>using namespace std;int main(){ int n; cin&gt

2021-05-23 11:51:42 48

原创 2021/5/16学习总结

01背包及其变形完全背包及其变形多重背包01背包其变形问题描述:一个人要抢劫银行,他有一个被抓的最大概率p,当超过这个概率就会被抓,有n个银行每个银行都有对应的钱和被抓的概率,问这个人,在被抓的概率小于p的情况下问最多可以获得多少钱。解题思路:首先要明白的是,概率不是相加起来的而是相乘,而这个概率一般都是小于一的所以我们可以交换这道题目的价值和体积,来计算抢银行的钱所对应的概率,来和p作比较来确定所获得最多钱数。代码如下#include<iostream>#include<

2021-05-16 11:43:53 95

原创 2021/5/28学习总结

背包问题贪心+背包问题问题描述:现在有m块钱,买东西需要的钱,当少于5的时候不能在买任何东西,问最少剩多少钱原题目地址(https://vjudge.net/contest/436354#problem/A)解题思路:可以把现在有的钱数看做背包问题中的体积,而购买物品的钱,即是体积也是价值,可以先留出来五块钱同时把最贵的那个保存下来,算最多的价值,而这个价值就是花费的钱,然后加上最贵的那个,在和总钱数做减法#include <iostream>#include <algorith

2021-05-08 16:20:19 67

原创 2021/5/2学习总结

区间dp问题环形dp小石子合并问题描述:n堆石头围成一个圈,摆放着共n堆的石子。现要将石子有序地合并成一堆。规定每次只能选相邻两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请编辑计算出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。解题思路:刚开始在想这个圆是什么样子,想明白后想着以每一个分别为起点开始,按行合并的方法合并,但这样就四重循环了,感觉一百多个数据就超时了。但通过学习时候,发现一种化曲为直的方法,可以把这个环形的石子合并改为链式合并。方法就是吧数据复制一遍,

2021-05-02 23:56:25 69

原创 2021/4/24学习总结

区间dp问题小石子合成一堆的问题:问题描述:一条直线上摆放着一行共n堆的石子。现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请编辑计算出将n堆石子合并成一堆的最小得分和将n堆石子合并成一堆的最大得分。解题思路:该问题是比较简单的区间dp问题,用dp[i][j]表示将第i个到第j合成一堆随要的重量,那么就可以把可以把要求的分为两队在合并,从第i个到第l在从第l+1到第l个,再把第i到第j的总重量加起来就可以了,这个可以用老师上课讲的区间和来

2021-04-24 23:39:11 73

空空如也

空空如也

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

TA关注的人

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