自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于正则表达式中的否定析取符号^

关于正则表达式中的否定析取符号^正则表达式中的否定析取符号有以下几种用法:在中括号外,用于表示其后面的一个元素是行首^a匹配对象abc匹配结果a在括号外面不加转义都表示其原本含义,即行首元素^a^b匹配对象abc匹配结果null不存在开头既是a又是b的串在括号外加了转义表示这个符号本身^a\^b匹配对象a^b匹配结果a^b在中括号内,表示其后面的各个元素都不会出现,即否定析取[^a]匹配对象a^b匹配结果^b中括号中出现在第一个

2021-06-16 16:25:40 1098

原创 字符串的编辑距离

字符串的编辑距离编辑距离其实就是一个字符串变成另一个字符串做的操作的权值之和。设dp[i][j]dp[i][j]dp[i][j]为字符串a的前i项和字符串b的前j项进行比较的编辑距离,那么有:若当前两末尾元素相等:dp[i][j]=dp[i−1][j−1],a[i]==b[j]dp[i][j] = dp[i-1][j-1], a[i] == b[j]dp[i][j]=dp[i−1][j−1],a[i]==b[j]若当前两末尾元素不等,那么寻找最小值:dp[i][j]=dp[i−1][j]+cos

2021-06-16 15:44:00 898

原创 PAT 1048 水题 注意c++的foreach

PAT 1048 水题 注意c++的foreach水题。注意c++的foreach在auto指针下遍历时,每次取出容器中的一个元素加入当前副本中,因此不能直接用当前元素进行更新,如果用auto& 指针则可以修改容器中的元素。代码:#include <iostream>#include <map>using namespace std;int N, M;map<int, int> m;int main(){ cin >> N &

2021-05-31 13:56:45 257

原创 PAT 1047 水题

PAT 1047 水题继续水,令人快乐代码:#include <iostream>#include <vector>#include <map>#include <string>#include <algorithm>using namespace std;map<int,vector<string>> m;int N,K;int main(){ cin>>N>>K;

2021-05-30 21:24:24 103

原创 PAT 1046 水题

PAT 1046 水题水代码:#include <iostream>#include <map>#include <string.h>#include <algorithm>using namespace std;const int maxn = 100005;int N,M,D[maxn];int main(){ memset(D, 0, sizeof(D)); cin>>N; for(int i

2021-05-30 19:10:38 103

原创 PAT 1045 最长不减子序列

PAT 1044 最长不减子序列最长不减子序列的变形,用map将颜色映射到其顺序,对其顺序求最长不减子序列即可。需要注意的是,upper_bound函数的开闭性为左闭右开,自己写的二分一般是左闭右闭。代码:#include <iostream>#include <map>#include <string.h>#include <algorithm>using namespace std;const int maxn = 10005;int

2021-05-30 18:43:42 110

原创 leetcode 629 逆序对数组计数 dp

leetcode 629 逆序对数组计数 dp很好的一题dp化简,关键在于想清楚每次新拿出来的元素比已经确定逆序对个数的前面所有元素都大,插在哪个位置就新增了多少逆序数。设dp[i][j]为前i个元素构成的含有j个逆序对的序列个数,那么第i个元素插在前i-1个元素的倒数第m个位置,就会新增m个逆序数,即dp[i][j] = Σ_m = 0~m = min(i-1,j)dp[i-1][j-m],当然这样时间复杂度要到O(nk^2),讨论i和j的大小关系确定求和上界,然后错位相减即可化简递推式,复杂度减小到O

2021-05-30 16:17:54 174

原创 HDU 1166 树状数组

HDU 1166 树状数组树状数组是解决区间查询问题的一种数据结构。区间查询最简单的形式就是求一段连续区间的和,这种问题可以用前缀和来解决,建立前缀和数组的时间复杂度为O(n),查询的时间复杂度为O(1)。但是当我们频繁对区间的一些点进行修改时,前缀和数组在每一次修改后的查询前都要更新,每次更新都是O(n),这样假如修改并查询m次,总的时间复杂度就来到了O(mn)。树状数组可以降低复杂度,它的建立时间复杂度为O(nlogn),每次修改的时间复杂度为O(logn),每次查询的时间复杂度也是O(logn

2021-05-30 16:17:32 161

原创 PAT 1044 前缀和+二分

PAT 1044 前缀和+二分不错的一道题。连续子串的若干个元素之和可以用一维前缀和来表示,而前缀和构成的数列本身肯定严格单调增,对每个前缀和元素作为开头的所有子串二分即可,复杂度O(nlogn)。代码:#include<iostream>#include<map>using namespace std;const int maxn = 100005;int nums[maxn];map<int,int> res,ans;int min_ = 0x3f

2021-05-30 11:43:25 145

原创 leetcode 300 最长上升子序列的长度

leetcode 300 最长上升子序列的长度给定一个整型数据串,求其严格单调递增的最长的子序列长度。两种思路,第一种思路dp,设dp[i]为以第i个数字作为结束元素的子序列的最长的长度,那么这个值只会与其前i-1个元素相关,递推式为:dp[i] = max{dp[k]}+1,1 <= k <= i-1 && nums[k] < nums[i]时间复杂度为O(n^2)代码:class Solution {public: int lengthOfLIS(

2021-05-30 10:36:30 178

原创 PAT 1043 分治

PAT 1043 分治简单的分治。代码:#include <iostream>#include <vector>using namespace std;const int maxn = 1005;int N;vector<int> res;int tree[maxn];bool flg1 = true,flg2 = true;void isBST(int left,int right){ if(left > right || !f

2021-05-28 21:30:44 75

原创 PAT 1042 水题

PAT 1042 水题水代码:#include <bits/stdc++.h>using namespace std;string s = "SHCDJ";int t;int Shuffling[55];vector<string> deck;vector<string> res;int main(){ cin>>t; deck.push_back("#"); for(int i = 1;i <= 54;

2021-05-28 18:46:33 167

原创 PAT 1041 水题

PAT 1041 水题水代码:#include <bits/stdc++.h>using namespace std;map<int,int> m;int N;vector<int> v;int main(){ cin>>N; for(int i = 0;i < N;i++){ int tmp; cin>>tmp; m[tmp]++; v.pu

2021-05-28 18:46:12 105

原创 PAT 1040 最长回文串

PAT 1040 最长回文串dp,练手代码:#include <bits/stdc++.h>using namespace std;string s;const int maxn = 1005;int dp[maxn][maxn];int dpf(){ int max = 1; for(int r = 2;r <= s.size();r++){ for(int i = 0;i <= s.size()-r;i++){

2021-05-28 18:44:46 115

原创 PAT 1039 水题

PAT 1039 水题太菜了,做做水题找自信。代码:#include <bits/stdc++.h>using namespace std;int N,K;map<string,vector<int>> m;int main(){ cin>>N>>K; for(int i = 0;i < K;i++){ int course,n; cin>>course>&g

2021-05-28 18:44:11 105

原创 PAT 1038 贪心

PAT 1038 贪心题目分析:贪心,每次选取能使最终的字符串字典序最小的元素。这个操作可以借由sort函数的cmp来确定。sort函数对于各种满足偏序关系的元素都可以进行排序,cmp函数给出这个偏序关系即可。在这个问题中,所有的元素顺序也有一个偏序关系:任意两个相邻元素互换位置,都会使得最终的字符串变大。证明:a,b,c三个元素相邻并满足偏序关系,那么a与b互换,b,a,c三个元素构成的字符串大于原来的字符串;再将a与c互换。。。几天后发现证不出来。。。这题的关键就在于证明这个偏序关系,这里

2021-05-28 18:43:34 96

原创 PAT 1037 贪心

PAT 1037 贪心贪心水题,结论很好证明。代码:#include <iostream>#include <vector>#include <algorithm>using namespace std;int n1,n2;vector<int> v1,v2,v3,v4;bool cmp(const int &a, const int &b){ return a > b;}int main(){

2021-05-19 17:19:11 121

原创 PAT 1036 水题

PAT 1036 水题比上题海水。。代码:#include <iostream>#include <string>#include <algorithm>#include <vector>using namespace std;struct student{ string name; string gender; string id; int grade; bool operator < (con

2021-05-19 16:38:03 73

原创 PAT 1035 水题

PAT 1035 水题水代码:#include <iostream>#include <map>#include <string>#include <vector>using namespace std;int N;map<string,string> m;vector<string> v;int main(){ cin>>N; for(int i = 0;i < N;i++){

2021-05-19 16:19:20 133

原创 PAT 1034 无向图dfs

PAT 1034 无向图dfs水题,虽然想了半天。。输出要按照字典序排序,第一次忘了导致测试点2没过。代码:#include <iostream>#include <map>#include <string>#include <set>#include <vector>#include <algorithm>using namespace std;map<string,int> w;map<s

2021-05-18 21:31:18 92

原创 PAT 1033 贪心

PAT 1033 贪心题目分析:一道不错的贪心题。首先看到这个题,我考虑的是区间dp,设dp[i][j]为i点到j点的最少话费,那么如何分解这个问题呢?我初步想的是寻找i到j之间的价格最低的站点,花费最少的钱到达那里,然后加满油,即类似dp[i][j]=dp[i][minst(i,j)]+dp[minst(i,j)][j]。但是这个思路是非常不完善的,dp[i][j]在出发时是不一定加满油的,在划分后的后半段出发时也不一定是加满的,这个加的量多少是无法确定的;此外没有考虑油箱的容量,也不知道某个点是否

2021-05-18 20:04:16 199

原创 PAT 1032 合并链表的首个相同元素

PAT 1032 合并链表的首个相同元素题目分析:本题虽然题目中用的suffix,但是实际上是只要有相同的段,该段就会合并为同一个链表,因此本题实际上是求一个合并链表的 首个公共元素。在建立链表时,可以比较轻松地统计合并点(即每个公共段的第一个公共点),但是第一个公共点不一定是合并点,还有可能是两个链表中的一个开始结点,这样讨论起来是比较麻烦的。实际上可以直接先从一个链表的开始结点开始遍历,对遍历过的每个结点都进行标记,完成后再从另一个链表的开始结点遍历,遇到的第一个已标记结点就是我们要求的首个相同

2021-05-17 17:36:49 128

原创 数据结构 图

数据结构 图图概念图由顶点集合和边集合构成,其中边可以是有向的,也可以是无向的,但是不存在顶点有直接和自身相连的边(自环),也不存在两个顶点之间的多个同向边。有向边用(u,v)表示,无向边用<u,v>表示。完全图(complete graph):顶点之间两两相连,有向图中边数为n(n-1),无向图中为n(n-1)/2。权(weight):边上的数值,带权图也叫做网络(network)。子图(subgraph):图的顶点的子集由其边的子集构成的图度(degree):与顶点v关联的

2021-04-16 13:43:34 805

原创 POJ 1251 最小生成树——kruskal与prim

POJ 1251 最小生成树——kruskal与prim最小生成树裸题,复习用。代码#include <iostream>#include <vector>#include <queue>#include <string.h>using namespace std;const int maxn = 100;struct Edge{ int u,v,w; bool operator < (const Edge &amp

2021-04-14 23:21:34 93

原创 leetcode 95 不同的二叉搜索树 II

leetcode 95 不同的二叉搜索树 II记忆化搜索,同上题。代码class Solution { vector<TreeNode*> backup[10][10];public: vector<TreeNode*> backTrack(int l,int r) { vector<TreeNode*> res; if(l == r){ res.push_back(new TreeNode(

2021-04-12 19:20:50 61

原创 leetcode 96 不同的二叉搜索树

leetcode 96 不同的二叉搜索树不同的二叉搜索树在前一博客中已经讨论。代码class Solution { int G[100000]; // 记忆化搜索 int memorySearch(int pos){ if(pos == 0){ return 1; } if(G[pos] != -1){ return G[pos]; }else{

2021-04-12 19:20:15 81

原创 数据结构 搜索结构

数据结构 搜索结构搜索是指根据根据元素的关键码或者属性,在存储结构中找到元素所处的位置。搜索结构有两种,静态搜索结构形态事先确定,如数组,动态搜索结构形态动态变化,如二叉搜索树。评价搜索结构的性能用搜索成功时的平均搜索长度ASLsuccess衡量,为找到每个元素的比较次数之和的平均值。二分查找给定n个有重复的元素,从小到大排序,搜索元素x在表中首次出现的位置,若x不存在,返回表中首个大于x的元素的位置(即x应插入的位置),或返回**-1**。#include <iostream>#

2021-04-12 16:29:34 327

原创 数据结构 集合与字典

数据结构 集合与字典集合集合,即数学上的集合概念。STL setset底层采用红黑树实现,从小到大排序,无重复元素。#include <iostream>#include <set>#include <vector>using namespace std;struct node{ int val; // 重载<运算符 bool operator < (const node &n)const{

2021-04-10 09:34:51 287

原创 POJ 1521 Huffman树

POJ 1521 Huffman树本题给出一个字符串,求其Huffman编码的长度。我们可以统计每个字符出现的次数作为该字符的权重,那么编码总长度就等于外部带权路径长度。进一步地,有结论:Huffman树的外部带权路径长度等于除根结点外的所有结点的权值之和(暂时还没想清楚为什么),因此不需建树,统计所有结点权重即可。输入仅有一个字符需要特判。poj不支持c++11,auto不可用。代码:#include <iostream>#include <map>#include

2021-04-03 17:14:06 648

原创 数据结构 树

数据结构 树树的基本概念**结点的度(degree):**结点拥有的子树的棵数**兄弟结点(sibling):**同一父结点的的子女**祖先结点(ancestor):**从根结点到该结点所经分支上的所有节点**子孙节点(descendant):**某个结点所有的子女及子女的子女及…**树的度(degree):**树中结点度的最大值**有序树(ordered tree):**各子树有次序二叉树二叉树概念书上的概念如下:**满二叉树(full binary tree):**每一层的结

2021-04-03 14:46:23 179

原创 PAT 1031

PAT 1031水题,虽然题目中的那个公式还是没看懂,不过大概意思应该就是n2>=n1。代码:#include <iostream>using namespace std;int main(){ string in; cin>>in; int n = (int) in.size(); int n1 = (n+2)/3; int n2 = n+2-2*n1; for(int i = 1;i <

2021-04-01 10:39:22 73

原创 数据结构 数组、串与广义表

数据结构 数组、串与广义表多维数组的存储多维数组在内存中是以一维形式储存的。对于n维数组,有以下映射关系:数组a[m1][m2]…[mn]中,元素a[i1][i2]…[in]的内存位置为:a + i1*m2*m3*…*mn + i2*m3*m4*…mn + … + in特殊矩阵的存储对称矩阵的压缩存储对称矩阵以上三角矩阵为例,压缩成一维数组存储,可以节省一半空间,其映射关系如下:上三角矩阵a[m1][m2],元素a[i][j]的对应一维矩阵的元素内存位置为:a + n + n-1 +

2021-03-31 19:36:09 122

原创 数据结构 栈与队列

数据结构 栈与队列栈与队列(优先队列、双端队列)是一类特殊的线性表。顺序栈和链式栈栈的存储方式有两种,基于数组和基于链表,分别被称为顺序栈和链式栈。栈与括号匹配括号匹配问题,某个字符串中的三类括号能否匹配,只需将左括号入栈,每次比较当前字符和栈顶字符是否匹配即可。#include <iostream>#include <stack>using namespace std;int main(){ string in; cin>>in;

2021-03-27 20:35:11 464

原创 数据结构 线性表

数据结构 线性表线性表是一个每个相邻表项之间都有直接前驱和直接后继的有限序列。线性表有两种储存方式,顺序存储和链式存储,对应的数据结构就是顺序表(数组)和链表。单链表单链表的每个节点都有一个数据域和一个后继节点指针,其中第一个节点不储存数据,称为头结点,目的是使得开始节点和其它节点的各种操作的流程一致。建立两种建立方式,头插法和尾插法。两种均建立在头结点的基础上。头插法将新节点插入在头结点之后,开始节点之前,和输入顺序相反。尾插法将新节点插入在当前的尾结点之后,和输入顺序相同。插入将某个

2021-03-26 21:07:21 155

原创 PAT 1030 g++与clang++

PAT 1030 g++与clang++虽然是个dijkstra的水题,但是还是有挺多离谱的地方。首先INF的定义,实际上是0x3f3f3f3f,之前一直写成0x3f3f3f。。。这样在memset的时候就可以直接对每个字节都赋值0x3f即可。再次就是编译器的问题,不知道为啥我的代码很多在g++上都有问题,clang就ok,老是过不了的同学可以试试换个编译器。代码:#include <iostream>#include <string.h>using namespac

2021-03-25 21:42:40 1140

原创 线性代数 矩阵相似对角化的理解

线性代数 矩阵相似对角化的理解矩阵的相似对角化,是一种基变换,或者说是坐标系变换,本质上是将线性变换在原坐标系(标准坐标系)中的表示变换为在新的坐标系下的表示,而这个新的坐标系刚好是由线性变换的一组线性无关的特征向量作为基建立的。在n维空间中的n个线性无关的向量张成了这个n维空间,它们是这个n维空间的一组基底。一般地,二维空间,我们用i和j两个单位正交基来建立坐标系表示,也就是我们的x轴和y轴。同样的道理,我们也可以用任意一组基底建立坐标系描述,将原来的坐标系下的一个或者一组向量变换到新基底下的表示方式

2021-03-24 22:44:23 12018 2

原创 PAT 1029

PAT 1029水题again代码:#include <cstdio>using namespace std;const int maxn = 200050;int num1[maxn],num2[maxn];int main(){ scanf("%d",&num1[0]); for(int i = 1;i <= num1[0];i++){ scanf("%d",&num1[i]); } sc

2021-03-24 17:21:34 71

原创 线性代数 特征值和特征向量的理解

线性代数 特征值和特征向量的理解首先,n阶方阵在几何上对应的是某一种线性变换。n维空间中的一个向量乘以该矩阵,得到的结果就是在空间中对这个向量进行该矩阵对应的线性变换后得到的向量。因此,特征值和特征向量AX = λX的几何含义就是,向量X在经过线性变换A之后,得到的向量只在原向量的基础上线性变化了λ倍,它们仍然是共线的。一个特征值可能对应着多个特征向量,而一个特征向量只有一个对应的特征值很好理解,沿某个方向拉伸λ倍的线性变换A,这个方向上的所有向量肯定都是的λ特征向量;而线性变化A是独

2021-03-24 16:45:39 5434 1

原创 PAT 1028

PAT 1028水题使人快乐。两个知识点:c++字符串字典序比较:string s1 = "12sdjsadj";string s2 = "r26retywrewt";s1.compare(s2);若s1的字典序大于s2,则返回正数,若小于,则返回负数,相等则返回0。这一题用cincout会卡最后一个测试点,改成scanfprintf就可以了。printfc++里的string还是%s,但是需要将string调用.c_str()变成c语言字符串。代码:#include <ios

2021-03-23 19:09:32 122

原创 线性代数 线性相关与线性表示的理解

线性代数 线性相关与线性表示的理解https://www.zhihu.com/question/39326459/answer/452801233首先,向量是仅有一行或者一列的特殊矩阵,我们将其每一个元素视为一个维度,n维向量就存在于n维空间内。我们可以把各个维度视为描述某个向量的各个方面,那么某些向量之间就有可能有一些替代关系。这个向量,像知乎答主的例子,可以被视为一个人的各个能力方面。比如某个维度,两个向量在这个维度上的值分别为2和4,那我们就可以说在这个维度上,向量2可以由2个向量1表示。

2021-03-22 22:01:25 4312 2

空空如也

空空如也

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

TA关注的人

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