- 博客(87)
- 收藏
- 关注
原创 小国王()
思路 :1)根据 枚举出每行状态,再筛选出单行之间合法的状态例: 第i行可能的状态为 0 1 0 1 0 ,或 0 1 1 1 0显然 根据题意得出 同一行类不能有相邻的 2 个国王所以在筛选状态时需要判断同行之间是否存在相邻的 2 个一2)在处理完单行之间的状态后,先需处理各行之间的状态0 0 1 0 1 0 1 (i - 1行)0 0 0 0 0 0 0 (i 行)0 1 0 1 0 1 0 (i + 1行)第i行的状态是由 i - 1 行与 i+ 1 行决定的不难..
2022-05-16 19:51:20
144
原创 带头双向循环链表
#include <stdio.h>#include <stdlib.h>typedef int Val;typedef struct ListNode{ Val _data; struct ListNode* _next; struct ListNode* _prev;}Node;// 创建返回链表的头结点.Node* ListCreate();// 双向链表销毁void ListDestory(Node* pHead);// 双向链表打印vo.
2022-05-15 16:48:24
263
原创 多重背包III (男人八题,单调队列优化)
1)状态表示f(i,j) 选第i个物品,最大体积是j的最大值f(i,j) = max( f[i-1][j-v]+w,f[i-1][j-2v]+2w,....... ,f[i-1][j-(s-1)v]+(s-1)w,f[i-1][j-sv]+sw)//f(i,j-v) = max(f[i-1][j-v],f[i-1][j-2v]+w, ....,f[i-1,j-sv] + sv,f[i-1,j-(s+1)v]+(s+1)w//每个物品有s个,假设取到最大可以发现...
2022-05-11 14:27:43
319
原创 最长公共上升子序列
一: 状态表示f[i][j] ;第一个序列前 i 个字母,与第二个序列前 j 个字母,为确定公共上升子序列的结尾数我们规定以第二个序列的第 j 个字母为结尾;第一个序列前 i 个字母,与第二个序列前 j 个字母,并且以第二个子序列第 j 个数结尾的公共上升子序列二 :状态计算 划分为包括第 i 个数与不包括第 i 个数的两个集合 对于不包括第 i 个数的f[i][j] = f[i - 1][j]; 第二种状态的判...
2022-05-09 22:02:31
603
原创 传纸条()
#include <iostream>using namespace std;const int N = 55;int f[N * 2][N][N],a[N][N];int n,m;int main(){ cin >> n >> m; for (int i = 1;i <= n;i ++ ) for (int j = 1;j <= m;j ++ ) cin >...
2022-05-07 15:58:06
433
原创 畜栏预定
#include <iostream>#include <unordered_map>#include <queue>#include <algorithm>using namespace std;const int N = 500010;typedef pair<int,int> PII;pair<PII,int> mp[N];//保存区间和编号int ans[N] ;int n;int m...
2022-05-06 11:57:47
332
原创 电影(算法竞赛进阶指南)
#include <iostream>#include <algorithm>using namespace std;const int N = 2000010;int a[N],b[N],c[N],idx,f[N * 3];//原始数据总集int silt[N * 3],idx2;//散列表最终集合int en[N * 3];//对应每门语言专家的人数int n,m;int find(int x)//查找离散化之后点的位置{ int l = 1...
2022-05-05 19:04:25
688
原创 滑动窗口
#include <iostream>using namespace std;const int N = 1000010;int a[N],q[N];int n,k;int main(){ cin >> n >> k; for (int i = 0;i < n;i ++ ) cin >> a[i]; int h = 0,t = -1;//存储小标 for (int i = 0;i &l...
2022-05-03 19:38:19
417
2
原创 起床困难综合征
/*如果该位填 1 后,所得到的数大于 m,那么该位填 0否则如果该位填 1 后,所得到的数对 n 个数都运算之后,结果小于等于该位填 0 后得到的结果,那么为了让剩下能填的数更大,该位填 0否则该位填 1*/#include <iostream>using namespace std;const int N = 10e5 + 10;char ch[4];int st[N];int h[N];int n,m;int ans ;int chang...
2022-05-03 17:41:04
287
原创 滑雪(矩阵求最长线路)
#include <iostream>#include <cstring>using namespace std;const int N = 310;int f[N][N];int a[N][N];int n,m;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};int dfs(int x,int y){ if(f[x][y] != -1) return f[x][y]; f[x][...
2022-05-01 15:00:21
372
原创 计数问题(计算0~9在n中出现的次数)
#include <iostream>#include <vector>using namespace std;//设有整数 abcdef// ffxzzz//当 x 取到 c 位时/* 有 : (1) 1.1 000 ~ ab-1 当前几位小于 ab时 可以选择 c前的数字 * 10^c后的位数 1.2 当x取0时 只能取 001 ~ ab - 1 (2) 当ff == ab 时 2....
2022-05-01 14:49:45
665
原创 蒙德里安的梦想(状态压缩dp)
#include <iostream>#include <cstring>using namespace std;const int N = 12,M = 1 << N;bool st[M];//表示所有列的状态long long f[N][M];int n,m;int main(){ while(cin >> n >> m , (n || m)) { ...
2022-04-30 17:22:39
316
原创 剑指offer 礼物max价值
class Solution {public: int f[1355][1355]; int getMaxValue(vector<vector<int>>& grid) { f[0][0] = grid[0][0]; for (int i = 1;i <= grid.size();i ++ ) for (int j = 1;j <= grid[0].size(); j ++) ...
2022-04-29 20:28:47
170
原创 最短编辑距离(把字符串在最少操作次数类转换成B)
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 10100;char a[N],b[N];int n,m;int f[N][N];int main(){ scanf("%d %s",&n,(a + 1)); scanf("%d %s",&m,(b + 1)); ...
2022-04-29 15:37:34
352
原创 最长递增子序列
一: 初级版,时间复杂度n^2#include <iostream>using namespace std;const int N = 1010;int a[N],f[N];int n;int main(){ cin >> n; for (int i = 1;i <= n;i ++ ) { cin >> a[i]; } for (int i = 1;i <..
2022-04-29 15:35:20
219
原创 背包问题合集
01背包问题#include <iostream>using namespace std;const int N = 1010;int f[N],v[N],w[N];int n,m;//二维背包//int f[N][N];/*int main(){ cin >> n >> m; for (int i = 1;i <= n;i ++ ) cin >> v[i] >> w[i]; .
2022-04-26 21:44:44
478
2
原创 匈牙利算法 二分图的最大匹配
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N=600,M=10e6+10;int h[N],e[M],ne[M],idx;int uh[N],n1,n2,m;//uh[N]存储的是与他配对的点bool st[N];void add(int a,int b){ e[idx]=b; ne[idx]=...
2022-04-22 18:53:58
201
原创 染色法判定二分图
思路一:当图里有奇数边的环是该图不是二分图二: 把所有点染上两种不同颜色,如果是二分图则两种颜色分配一定均匀三: 染色过程中出现颜色冲突就不是二分图四:每一个节点的连通的下一个节点与该节点颜色相反五: 如果一个节点没有染色,就把他和他的所有连通点染色#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N=.
2022-04-21 19:52:44
365
原创 Prim算法求最小生成树
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N=600,M=10e5+10;int h[N][N];int dist[M];bool st[N];int n,m;int prim(){ memset(dist,0x3f,sizeof dist);//所有点到集合距离初始化为无穷 int re...
2022-04-21 19:09:05
287
原创 Kruskal算法求最小生成树
思路:将所有边按权从大到小排序,枚举每条边,利用并查集判断点a,b是否连通(默认每个点都是离散的),如果不连通就连通a,b#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N=200110;int p[N],n,m;struct edge{ int a; int b; int w...
2022-04-21 18:51:54
474
2
原创 spfa判断是否存在负环
#include <iostream>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int N=100010;int h[N],e[N],w[N],ne[N],idx;bool st[N];int dist[N],cnt[N],n,m;void add(int a, int b, int c) // 添加一...
2022-04-21 14:49:54
95
原创 floyd算法(求多源最短路)
#include<iostream>#include<cstring>#include <algorithm>using namespace std;const int N=300,IN=10e8;int a[N][N];int n,m,k;void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++...
2022-04-20 16:44:26
342
原创 spfa求最短路
#include <iostream>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int N=10e5+10,M=N;int h[N], e[M], w[M], ne[M], idx;int dist[N];bool st[N];int n,m;void add(int a,int b,int c){ ...
2022-04-20 16:31:29
103
原创 bellman_ford算法
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 510, M = 100010;int dist[M],dcp[M];int n,m,k;struct Bell{ int a,b,c; }bell[M];int bellman(){ memset(dist,0x...
2022-04-20 15:07:33
127
原创 最短路径之dijkstra算法(单源最短路)(堆优化,适用于稀疏图)
#include <iostream>#include <cstring>#include <algorithm>#include <queue>#include <vector>using namespace std;const int N = 150000,M=N*2;typedef pair<int, int> PII;int h[N], e[M], w[M], ne[M], idx;int ...
2022-04-18 22:37:20
315
原创 最短路径之 Dijkstra算法(单源最短路)
一:算法框架使用临接矩阵来存储每两个点之间的距离,再使用一个数组存储源点到其他点的距离,使用一个bool数组来判断某个点是否已经被使用过,如果该点被遍历过那么该点到源的距离确定且最短;二:实现步骤1- 从源点开始依次选择离源点最近的点(包括源点但跳过)2-之后确定该点与源点的距离,bool数组对应的位置为真,3-从找到的点开始拓展该点到源点再到该点下一点的距离与该点下一点的距离到源点的距离,取最小值赋值给下一点对应的距离数组;4-重复前面步骤,直到结束;三,代码实现
2022-04-17 19:29:52
546
原创 图论 ----(图的遍历与拓扑序列)
目录树的重心(有向图的深度优先遍历)图中点的层次(有向图的宽度优先遍历)有向图的拓扑序列树的重心(有向图的深度优先遍历)//删除节点后最大连通块集合中的最小连通块#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 10e5+10,M=2*N;int h[N], e[M], ne[M],..
2022-04-17 15:04:07
474
原创 剑指offer---机器人的运动范围(bfs)
地上有一个m行和n列的方格,横纵坐标范围分别是0∼m−1 和0∼n−1。一个机器人从坐标(0,0)的移动,每一次只能向左,右,上,下四个方向移动一格。但是不能进入行坐标和列坐标的数位之和大于kk的格子。请问该机器人能够达到多少个格子?注意:0<=m<=50 0<=n<=50 0<=k<=100样例1输入:k=7, m=4, n=5输出:20样例2输入:k=18, m=40, n=40输出:1484解...
2022-04-16 15:52:31
147
原创 矩阵中的路径(矩阵寻找存在的单词)
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。注意:输入的路径不为空; 所有出现的字符均为大写英文字母;数据范围矩阵中元素的总个数[0,900]路径字符串的总长度[0,900]样例matrix=[ ["A","B","C","E"], ["S","F","C","S"], ..
2022-04-16 13:21:32
245
原创 三种方法实现哈希表(拉链法,二次探测法,开放寻址法)
维护一个集合,支持如下几种操作:I x,插入一个数x; Q x,询问数xx是否在集合中出现过;现在要进行 N 次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数 N,表示操作数量。接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。输出格式对于每个询问指令 Q x,输出一个询问结果,如果 x在集合中出现过,则输出 Yes,否则输出 No。每个结果占一行。数据范围1≤N≤10^5−10^9≤x≤10^9输入样例:...
2022-04-15 19:50:07
1252
1
原创 八数码 (Airbnb面试题)(bfs)
在一个3×3 的网格中,1∼8 这8个数字和一个x恰好不重不漏地分布在这3×3的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2 ...
2022-04-15 12:59:02
205
原创 走迷宫(起点到终点的最短路径)
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角 (1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n,m) 处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m)处的数字为 0,且一定至少存在一条通路。输入格式第一行包含两个整数 n 和m。接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。..
2022-04-14 19:09:15
663
原创 n-皇后问题
n−皇后问题是指将n个皇后放在n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数n。输出格式每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。其中.表示某一个位置的方格状态为空,Q表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。注意:行末不能有多余空格。输出方案的顺序任意,只要不重...
2022-04-13 19:59:42
415
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人