数据结构
爪蛙毁一生
6
展开
-
数论-筛法思想题目合辑
例如:n=4n=4n=4d(1)=1,d(2)=2,d(3)=2,d(4)=3,1+2+2+3=8d(1)=1,d(2)=2,d(3)=2,d(4)=3 , 1+2+2+3=8d(1)=1,d(2)=2,d(3)=2,d(4)=3,1+2+2+3=8思路:1 2 3 4 都是1的倍数所以 n/1 等于所有数的约数含有1的个数2 4 都是2的倍数所以 n/2 等于所有数的约数含有2的个数所以可以推出 1-n 的约数之和就是sum=(n/1+n/2...n/n)sum = (n/1+n/2...n/n)原创 2022-06-07 16:07:18 · 177 阅读 · 0 评论 -
并查集 洛谷 P2121 拆地毯
题目:链接https://www.luogu.com.cn/problem/P2121代码:原创 2022-06-03 18:36:43 · 109 阅读 · 0 评论 -
并查集 力扣 695. 岛屿的最大面积
题目:链接https://leetcode.cn/problems/max-area-of-island/代码:原创 2022-06-03 18:34:13 · 184 阅读 · 0 评论 -
并查集 力扣 785. 判断二分图
题目:链接https://leetcode.cn/problems/is-graph-bipartite/代码:原创 2022-06-03 18:32:06 · 113 阅读 · 0 评论 -
最小生成树 蓝桥云课 村庄通电
题目:链接https://www.lanqiao.cn/problems/162/learning/代码:原创 2022-06-02 18:58:10 · 101 阅读 · 0 评论 -
最小生成树 力扣 1584. 连接所有点的最小费用
题目:链接https://leetcode.cn/problems/min-cost-to-connect-all-points/代码:原创 2022-06-02 18:55:53 · 211 阅读 · 0 评论 -
并查集 力扣 547. 省份数量
题目:链接https://leetcode.cn/problems/number-of-provinces/代码:原创 2022-06-02 18:50:44 · 107 阅读 · 0 评论 -
dp 力扣 1025. 除数博弈
题目:链接https://leetcode.cn/problems/divisor-game/代码:原创 2022-06-01 11:29:31 · 109 阅读 · 0 评论 -
dfs加记忆化 力扣 312. 戳气球
题目:链接https://leetcode.cn/problems/burst-balloons/代码:原创 2022-06-01 11:27:16 · 95 阅读 · 0 评论 -
dp力扣 329. 矩阵中的最长递增路径
题目:链接https://leetcode.cn/problems/longest-increasing-path-in-a-matrix/代码:原创 2022-06-01 11:24:32 · 128 阅读 · 0 评论 -
dp 力扣 97. 交错字符串
力扣 97. 交错字符串题目:链接:https://leetcode.cn/problems/interleaving-string/思路:使用动态规划思想根据题目可得 题目要求为给定三个字符串 s1、s2、s3,使用s1,s2字符串拼成s3字符串。dp[i][j]定义为 从字符串s1的前i个与字符串s2的前j个是否可以拼接为s3的i+j个dp状态为bool这题有三·种状态dp[i][j]状态转移为:s3[i+j]!=s1[i]&&s3[i+j]!=s2[j]: dp原创 2022-05-30 20:55:13 · 223 阅读 · 0 评论 -
dp 洛谷 P2758 编辑距离
洛谷 P2758 编辑距离题目:链接:https://www.luogu.com.cn/problem/P2758思路:使用动态规划思想根据题目可得 题目要求为要用最少的字符操作次数,将字符串 A 转换为字符串 Bdp[i]定义为 从A[i]转换成B[j]的最小步数的集合dp状态为min这题有四个状态1 不用操作;2 删除一个字符;3 插入一个字符;4 将一个字符改为另一个字符。dp[i][j]状态转移为: dp[i][j]=min(min(dp[i-1][j]+1,dp[原创 2022-05-30 20:41:03 · 223 阅读 · 0 评论 -
dp 力扣 115. 不同的子序列
力扣 115. 不同的子序列题目:链接:https://leetcode.cn/problems/distinct-subsequences/思路:使用动态规划思想根据题目可得 题目要求为 字符串s 中得到 字符串t的方案总数。dp[i][j]定义为从s[i]可以得到t[j]的方案的总数的集合dp状态为countdp[i][j]状态转移为: dp[i][j] = dp[i-1][j-1] + dp[i-1][j];代码:class Solution {public: lon原创 2022-05-30 20:20:27 · 141 阅读 · 0 评论 -
dp 力扣 91. 解码方法
力扣 91. 解码方法题目:链接https://leetcode.cn/problems/decode-ways/思路:使用动态规划思想根据题目可得 题目要求为 并返回解码方法的总数,从A-Z就是1-26,把数组里的数组两两组合或者不组合得到大方案数 。dp[i]定义为 从起点dp[0]到dp[i]的解码方法的总数的集合dp状态为count这题有几个边界条件1、不能组01-09的数2、数字以0开头就无法组成任何一种方案,因为0不能单独为一个数并且边界条件1。3、不能组成26以上的数字原创 2022-05-25 14:45:47 · 182 阅读 · 0 评论 -
dp 力扣 63. 不同路径 II
力扣 63. 不同路径 II题目:链接https://leetcode.cn/problems/unique-paths-ii/思路:使用动态规划思想首先先看题目要求,左上角到右下角将会有多少条不同的路径,只能走右和下,对应的就是只能从左和上到达dpi,j。dp[i][j]定义为从dp[0][0]起始点到dp[i][j]的路径的集合dp状态为countdp状态转移为nums[i][j]==0,dp[i][j]=0,否则dp[i][j]=dp[i-1][j]+dp[i][j-1]代码:原创 2022-05-25 13:55:16 · 148 阅读 · 0 评论 -
dp 力扣 64. 最小路径和
力扣 64. 最小路径和题目:链接:https://leetcode.cn/problems/minimum-path-sum/思路:使用动态规划思想根据题目可得只能走右和下,对应的就是只能从左和上到达终点路径上的数字总和的最小值dp[i][j]定义为 从起点dp[0][0]到dp[i][j]的路径集合dp状态为mindp[i][j]状态转移为: dp[i][j] = min(dp[i-1][j],dp[i][j-1] )+nums[i][j]代码:class Solution {原创 2022-05-25 13:41:17 · 140 阅读 · 0 评论 -
dp 力扣 300. 最长递增子序列
力扣 300. 最长递增子序列题目:链接https://leetcode.cn/problems/longest-increasing-subsequence/思路:使用动态规划思想根据题目可得题目要求为找到最长严格递增子序列的长度。dp[i]定义为从0到i的最长严格递增子序列的集合dp状态为 maxdp状态转移为 dp[i]=max(dp[i],dp[i-1]+1 需要满足条件sum[i-1]<sum[i],dp[i-2]+1(sum[i-2]<sum[i]),…,dp[0]+原创 2022-05-25 12:46:42 · 137 阅读 · 0 评论 -
dp 力扣 53. 最大子数组和
力扣 53. 最大子数组和思路:使用动态规划思想首先先看题目要求,寻找最大和的连续子数组dp[i]定义为从0到i的连续子数组和的值的集合dp状态为max根据题目可得 如果前i个连续子数组和小于0 则不与后面的子数组接上。dp状态转移为dp[i]=nums[i]+max(dp[i-1],0)代码:class Solution {public: int maxSubArray(vector<int>& nums) { int dp[100005]原创 2022-05-25 12:28:07 · 173 阅读 · 0 评论 -
bfs 牛客 跳马游戏
牛客 跳马游戏题目:链接https://ac.nowcoder.com/acm/problem/201622思路:根据题目可得,“跳马”能跳周围总共八步,使用bfs搜索,从初始位置出发,并用map去存每个点的步数,跳到了最终位置直接退出bfs。代码:#include <bits/stdc++.h>using namespace std;int bx[]= {1,2,2,1,-1,-2,-2,-1},by[]= {2,1,-1,-2,-2,-1,1,2}; //周围八步q原创 2022-05-21 22:30:29 · 238 阅读 · 0 评论 -
bfs 蓝桥云课 长草
蓝桥云课 长草题目:链接 https://www.lanqiao.cn/problems/149/learning/思路:根据题目可得,使用bfs扩散,从多个源点出发,用map记录好每一个节点的步数,大于k个月的节点不继续进行扩散。代码:#include <bits/stdc++.h>using namespace std;const int maxn=1005;queue<pair<int,int>> q;map<pair<int,i原创 2022-05-21 22:02:12 · 230 阅读 · 0 评论 -
bfs 牛客 走出迷宫
牛客 走出迷宫题目:链接https://ac.nowcoder.com/acm/problem/14572思路:由题可知,是一个单源最短路,使用bfs搜索,从S点出发找到E点即可,用一个标志位判断是否找到。代码:#include <bits/stdc++.h>using namespace std;const int maxn=505;int n,m;char a[maxn][maxn];int ax[]= {0,0,1,-1},ay[]= {1,-1,0,0};q原创 2022-05-21 21:52:55 · 161 阅读 · 0 评论 -
bfs 蓝桥云课 九宫重排
蓝桥云课 九宫重排题目:链接https://www.lanqiao.cn/problems/261/learning/思路:根据题目得出,与空格相邻的数字可以与空格交换,反过来就是空格可以与相邻的数字交换,所以使用bfs搜索空格与每个相邻的数字交换的结果,找到与终态相同的就可以退出了。代码:#include <bits/stdc++.h>using namespace std;const int maxn=10005;queue<string> q;map&原创 2022-05-21 21:43:04 · 134 阅读 · 0 评论 -
bfs 蓝桥云课 调手表
蓝桥云课 调手表题目:链接:https://www.lanqiao.cn/problems/230/learning/思路:由题目得出,使用bfs搜索从0点开始到每一点的最短路径,其中可以走1分钟,或者走k分钟。代码:#include <bits/stdc++.h>using namespace std;const int maxn=100005;queue<int> q;int bk[maxn];char arr[maxn];int main() {原创 2022-05-21 21:26:21 · 145 阅读 · 0 评论 -
dfs剪枝 P1120 小木棍
dfs剪枝 P1120 小木棍题目:链接https://www.luogu.com.cn/problem/P1120思路:用dfs进行可以组成多少长度的大木棍进行全遍历,数据量是1-65,所以全遍历会超时,所以需要进行剪枝,剪枝1,小木棍组成的长度大于我们需要组成的大木棍的长度的话就不进行下去了,剪枝2,组成的大木棍一定是大于小木棍的最大值,剪枝3,组成多少长度的大木棍一定是小木棍总长度的倍数,剪枝4,把木棍排序,优先从大的小木棍开始拿可以跟快的合成大木棍,剪枝5,如果小木棍拼不成,那么和原创 2022-05-21 18:05:11 · 350 阅读 · 0 评论 -
dfs 牛客 走出迷宫
牛客 走出迷宫题目:链接https://ac.nowcoder.com/acm/problem/14572思路:用dfs的染色法(bk记录数组不进行回溯),根据题目可得,边界条件为数组边界,走到#(障碍物)返回,结束条件为找到E(终点),把标志位设为1,即已找到,整个dfs结束。代码:#include <bits/stdc++.h>using namespace std;int n,m,b[505][505];char a[5000][5000];int bo=0;v原创 2022-05-21 17:29:40 · 193 阅读 · 0 评论 -
dfs 洛谷 P1605 迷宫
洛谷 P1605 迷宫题目:链接 https://www.luogu.com.cn/problem/P1605思路:从出发点点出发dfs搜索每一次可以到达终点的路径,边界条件为不能走障碍物(在输入障碍物时把障碍物的bk先赋值为1就好了),不能走出数组范围,可以到达终点的条件为遇到终点方案总和就++。代码:#include <bits/stdc++.h>using namespace std;int n,m,b[5000][5000],x1,y_1,x2,y2,k;int原创 2022-05-21 17:13:47 · 142 阅读 · 0 评论 -
dfs 洛谷 P1162 填涂颜色
P1162 填涂颜色题目:链接 https://www.luogu.com.cn/problem/P1162思路:根据题目得出,是闭合圈那里面的数一定不能到边界,那么转换一下就是把所有开放圈变成1,剩下的就是闭合圈了,所以从边界出发把所有闭合圈染成1即可。代码:#include <bits/stdc++.h>using namespace std;int n,a[50][50],b[50][50];void dfs(int i,int j) { if(i<原创 2022-05-20 14:27:36 · 257 阅读 · 0 评论 -
dfs 蓝桥云课-玩具蛇
蓝桥云课-玩具蛇题目:链接https://www.lanqiao.cn/problems/1022/learning/思路:根据题目可得,此题就是在4*4的方格里连续的放置1-16的数字,那么使用dfs搜索从每个格子出发所有可以得出的不同的方案就好了,边界条件设置为不能超出数组边界,方案条件拿到16就是一种方案了,累加其值。代码:#include <bits/stdc++.h>using namespace std;int b[5000][5000];int ans=0;原创 2022-05-20 14:17:29 · 265 阅读 · 0 评论 -
dfs P1219 [USACO1.5]八皇后 Checker Challenge
P1219 [USACO1.5]八皇后 Checker Challenge题目:思路:使用dfs全排列使用dfs进行遍历全部的方案,根据题目可知,边界条件设置为拿到行数等于n时,输出前三个方案并记录方案数,放置棋子数组使用二维数组存储,记录放下棋子时把整行,整列与对角线全部++,这里++的原因是回溯时如只赋为一的话,有可能会把前面选取的棋子覆盖的整行,整列与对角线的记录给回溯掉。代码:#include <bits/stdc++.h>using namespace std;i原创 2022-05-19 13:59:28 · 265 阅读 · 0 评论 -
dfs 洛谷 P1036 [NOIP2002 普及组] 选数
P1036 [NOIP2002 普及组] 选数题目:思路:使用dfs选数模型dfs递归遍历序列,有两种状态,一种是选,一种是不选,根据题目可知,选与不选总个数不能大于n,选的个数不能大于k,如果选的个数等于k,并且是累加和为素数,记录个数。代码:#include <bits/stdc++.h>using namespace std;int n,m;int a[100005];int ans=0;int shusu(int s){ if(s<=3) s&g原创 2022-05-19 13:39:21 · 408 阅读 · 0 评论 -
dfs 整数分解系列问题
题目1:思路:使用dfs进行遍历整数分解的方案,边界条件设置为累加值不能大于n,分解的个数不能大于k,如果满足累加值等于n,分解的个数等于k,并且是升序排列(此处在整数分解的循环选数时已判断)记录下每方案。代码:#include <bits/stdc++.h>using namespace std;vector<int> v;vector<int> sum[1000];int ans=0,n,k;void dfs(int s,int t) {原创 2022-05-19 00:09:17 · 246 阅读 · 0 评论 -
差分数组 洛谷 P4552 [Poetize6] IncDec Sequence
差分数组 P4552 [Poetize6] IncDec Sequence题目:思路:利用差分数组把第一个数当成差分数组的基数值,把其他项转换成0,就可以得到一个负数和 与一个正数和,因为每次只能加一和减一,所以如果正数大,最小次数就是正数次,如果负数的绝对值大,最小次数就是负数次能得到多少种结果就是每次只能加一和减一之后 还剩余的次数, 所以找正数次的和与负数次的和的差值。代码:#include <bits/stdc++.h>#define ll long longusing原创 2022-05-18 23:40:25 · 320 阅读 · 0 评论 -
力扣1526. 形成目标数组的子数组最少增加次数
1526. 形成目标数组的子数组最少增加次数题目:思路:运用到差分数组把需要形成目标的数组进行差分,得到目标的数组的差分数组,初始数组为0的话,差分数组也为0,接下来只要把为差分数组转换成目标的数组的差分数组就是操作次数了,一次操作只能使初始差分数组加一,所以只要求得目标差分数组的所有正数项之和就得到答案了。class Solution {public: int minNumberOperations(vector<int>& target) { in原创 2022-05-18 23:23:59 · 126 阅读 · 0 评论 -
二维前缀和
二维前缀和模板给你一个n * m 的数字矩阵,然后Q次询问,每次问你一个矩阵 左上角是(x1,y1) 右下角是 (x2,y2) 的矩阵的和要求:能够O(1)处理询问思路:如图所示,dp[i][j]的大小应该就等于a[i][j] (数值本身)的值加上 dp[i][j-1] + dp[i-1][j] 再减去中间那段重复累加的dp[i-1][j-1]; for(int i = 1 ; i<=n; i++) for(int j=1; j<=m; j++) //求前缀和原创 2022-05-18 17:27:08 · 146 阅读 · 0 评论 -
学习笔记-数据结构与算法 dp模型2 (动态规划)
1.前缀和for(int i = 1 ; i <= n ;i++) dist[i]=dist[i-1]+a[i];cout << dist[n] << endl; //求1~n的前缀和cout << dist[l]-dist[r] << endl; //求r~l的前缀和2.最短路计数最短路计数-------> dijstra算法(之前的图论博客有)way[i]从s到i的最短路的方案数开wag数组初始化 wag[s]=1松弛.原创 2021-06-02 11:49:31 · 201 阅读 · 1 评论 -
学习笔记-数据结构与算法 图论
1.并查集一种维护集合的数据结构.顾名思义,主要有两种操作:并:将两个集合合并.查:查询某个数在哪个集合/查询两个数是否在同一个集合.考虑一个这样的问题:给你n个点,m个关系,每个关系(x,y)属于同一个集合。最后Q次询问,每次问你两个数是否在同一个集合.实现过程: f数组代表每个点所在的集合的父亲节点.也表征我们在哪个集合(这里我们认为每个集合有且仅有一个父亲节点,那么自然的就可以将这个父亲节点看作整个集合的标志). 1. 最开始的时候每个数都是独立的一个集合. 线都.原创 2021-06-01 11:23:04 · 169 阅读 · 0 评论 -
牛客网-YB要打炉石
YB要打炉石链接:https://ac.nowcoder.com/acm/problem/15032来源:牛客网思路:#include <bits/stdc++.h>using namespace std;int dp[100];int a[100];int main(){ int n ; cin >> n; for(int i = 0 ; i < n ;i++) cin >> a[i]; int原创 2021-05-31 19:11:59 · 114 阅读 · 0 评论 -
蓝桥云课-通电
通电链接:https://www.lanqiao.cn/problems/162/learning/来源:蓝桥云课思路:运用并差集,先把每一个的x,y,h用公式求出每一个村庄到其他村庄的距离,再把距离排序,优先取最小的。ps:公式题目上的有误,应该是sqrt((x1-x2)2+(y1-y2)2)+(h1-h2)2#include<bits/stdc++.h>using namespace std;int fa[1010];double ans;struct Edge{原创 2021-05-31 16:03:05 · 943 阅读 · 0 评论 -
洛谷-滑雪
滑雪题目链接:https://www.luogu.com.cn/problem/P1434#submit题目来源:洛谷思路:dfs加记忆化搜索,从每个点出发比较最长距离,记忆化每次走过的地方(节省运算时间)。#include <bits/stdc++.h>using namespace std;int n ,m;int a[105][105];int sp[10][10]= {{-1,0},{1,0},{0,-1},{0,1}};int bk[105][105];原创 2021-05-31 10:41:10 · 235 阅读 · 0 评论 -
acwing-八数码
八数码链接:https://www.acwing.com/problem/content/847/来源:acwing思路:bfs题,用x记下每一次的"x",给定边界条件,上下左右各走一次,全部入队列,用unordered_map 储存每一次走的整个字符串,与b字符串相等直接结束。ps:切记一定要用unordered_map(unordered_map / unordered_set 比map/set 快,不带排序功能)#include <bits/stdc++.h>using原创 2021-05-30 20:47:35 · 180 阅读 · 0 评论