![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
SF_C++/Java
经典题目解题及思路!!!
一个很懒的人
在路上!
展开
-
图 —— 最短路径问题
0.概要本文主要介绍以下三种方法求解最短路径问题:BFS——单源最短路径问题(简要介绍)Dijkstra_单源最小路径(详细介绍——算法、分析、时间复杂度、实现代码(见文末))3.Floyd_任意两点最小值(多源最短路径)——(详细介绍——算法、分析、时间复杂度、实现代码(见文末))问题描述:解决方法:1.BFS——单源最短路径问题(了解即可)初始化:求解完成:与广度优先生成树的关系:2.Dijkstra_单源最小路径(1)算法思想此算法算是贪心思想实现的,首.原创 2021-08-30 20:23:02 · 492 阅读 · 2 评论 -
图的遍历 —— DFS、BFS
0.概要本文主要从以下三个方面介绍图的遍历:图的广度优先遍历(BFS)图的深度优先遍历(DFS)两种遍历一般性实现代码(C++)1.图的广度优先遍历(BFS)(1)树 (层次遍历) VS 图 (BFS——广度优先遍历)(2)算法要点——BFS连通图非连通图(3)遍历序列可变性(4)空间复杂度(5)时间复杂度(6)广度优先生成树对⾮连通图的⼴度优先遍历,可得到⼴度优先⽣成森林1.图的广度优先遍历(BFS)(1)算法要点(2)遍历序列可.原创 2021-08-29 19:21:48 · 5105 阅读 · 0 评论 -
poj 3280(区间dp、java实现)
代码注释清晰,如果还不能理解请参考我的另一篇博客,链接: (详解)区间DP —— 平行四边形优化.,希望对你有所帮助!!!题目信息:描述跟踪所有母牛可能是一项艰巨的任务,因此,农夫约翰(Farmer John)已安装了一个使它自动化的系统。他在每头奶牛上安装了一个电子ID标签,当奶牛经过扫描仪时,系统会读取该电子ID标签。各ID标签的内容目前单个字符串与长度中号(1≤ 中号 ≤2000)从的字母表字符绘制Ñ(1≤ Ñ ≤26)不同的符号(即,小写罗马字母)。母牛是顽皮的动物,有时试图通过向后走来原创 2020-07-25 11:07:33 · 352 阅读 · 0 评论 -
(“白话文”详解)蓝桥杯模拟 摆动序列
题目信息: 在网上看到了许多题解,但好多人好像没有明白奇、偶状态转移方程怎么推导出来了,这是一道比较好的动态规划的题目,如果你找到现在也没有搞懂状态转移方程的由来,那么恭喜你这篇文章是个突破,看完这篇题目你就可以懂了!!! (为了更好的理解,看这道题目之前,你可以先做一道初级的摆动序列的问题:链接: 动态规划详解——(初级)摆动序列.)问题描述如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。即 a[2i]<a[2i-1], a[2i+1]>a[2i]。原创 2020-07-23 15:54:09 · 163 阅读 · 1 评论 -
(动态规划分析)蓝桥杯 传球游戏
题目信息:【问题描述】 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里。两种传球的方法被视作不同原创 2020-07-23 09:14:49 · 174 阅读 · 0 评论 -
蓝桥杯 数的划分(动态规划分析)
题目信息:问题描述 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输入格式 n,k 输出格式 一个整数,即不同的分法 样例输入7 3样例输出4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}数据规模和约定 6<n<=200,2<=k<=6动态规划分析:这道题目有点原创 2020-07-22 09:37:12 · 1144 阅读 · 0 评论 -
多线程动态规划(过程详解)——蓝桥杯 方格取数
题目信息:问题描述 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下角的B点(N,N)。 在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。 输入格式 输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置原创 2020-07-21 21:20:48 · 666 阅读 · 0 评论 -
动态规划详解 —— 蓝桥杯 摆动序列
1.摆动序列题目描述:如果一个序列满足下面的性质,我们就将它称为摆动序列: 1. 序列中的所有数都是不大于k的正整数; 2. 序列中至少有两个数。 3. 序列中的数两两不相等; 4. 如果第i – 1个数比第i – 2个数大,则第i个数比第i – 2个数小;如果第i – 1个数比第i – 2个数小,则第i个数比第i – 2个数大。 比如,当k = 3时,有下面几个这样的序列: 1 2 1 3 2 1 2 1 3 2 3 2 3原创 2020-07-21 10:14:03 · 927 阅读 · 0 评论 -
hdu 1789(贪心算法、自定义排序(Comparable))
再次做作业求解方法 贪心算法知识点 贪心算法、自定义排序、自定义类(特殊)输入解题思路(完整AC代码再在最下方):1.贪心点分析: 对于所有的作业,按照分数从高到低排序,分数相同时,截止时间小的排在前面。另外初始化一个大小为 [1005] 的数组,用来保存某一天是否已经被占用 (排序可以采用Comparator或Comparable实现,许多题解采用Comparator实现,本文介绍采用Comparable实现的方法)。然后开始贪心,对于每份作业,看从当天到当前之前的时间里面,有没有空余原创 2020-07-10 11:18:44 · 625 阅读 · 1 评论 -
java 实现蓝桥杯模拟空地长草 DFS
空地长草求解方法 dfs。题目: 小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1。 小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。 这些草长得很快,每个月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空地扩展,这四小块空地都将变为有草的小块。 请告诉小明,k 个月后空地上哪些地方有草。 输入: 输入的第一行包含两个整数 n, m。接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没原创 2020-07-06 15:33:33 · 443 阅读 · 0 评论 -
连连看hdu_1175 java
连连看hdu_1175求解方法 dfs+回溯。问题描述: “连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。 玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的原创 2020-07-06 13:52:52 · 163 阅读 · 0 评论 -
最长公共子序列(输出长度、最长子序列)
问题描述:输入两个字符串,输出最长子序列长度和子序列字符串!解决思想:1.动态规划:状态数组 dp[i][j] 表示存储长度 i、j 的公共子序列长度2.状态转移方程1:dp[i][j]=dp[i-1][j-1]+1;(最后一个元素相等)状态转移方程2:dp[i][j]=max(dp[i-1][j],dp[i][j-1]);(最后一个元素不相等)具体动态规划思想解决问题可参考我的另一篇博客: 贪心算法与动态规划_(解题步骤、区别联系)样例输入:输入两行,每行为一个字符串!a.原创 2021-01-13 21:06:45 · 820 阅读 · 0 评论 -
0/1背包
0/1背包 最经典的动态规划问题!!!问题描述:给定一个背包体积V,N件物品,每件物品有其体积 v 和相应的价值 w ,求解背包体积 V 所能装载物品的最大价值(每件物品不能分割,只能选择装或不装!)解决思想:1.动态规划求解,dp[j]表达意思为,当背包装入体积为 j 时,背包所拥有的最大价值!2.状态转移方程(判断某件物品装与不装:dp[j]=max(dp[j],dp[j-v[i]]+w[i]);3.在动态规划求解时,采用了简化版一维数组dp表示,在两层循环中,第二层循环以 1.原创 2021-01-13 20:52:57 · 82 阅读 · 0 评论 -
排列组合详解!!!(两种语言、两种方式)
问题描述:以下AC代码有详细解释!!!输出排列、组合的基本序列,两种语言java、c++,两种方式,java采用比较原始的方法,c++采用深搜,基本原理相差不大,个人感觉c++更好使用和理解!全排列(c++):#include<bits/stdc++.h>using namespace std;//输入n,对n个数进行全排列,输出排列顺序 //全局变量 int n;int a[105]; //放置元素int flag[105];//打印函数void show(){原创 2020-11-29 17:17:43 · 797 阅读 · 0 评论 -
JAVA_自定义排序(Comparable、Comparator)详解
先给出一般过程分析,在代码片段中注释非常清晰!!!过程解析:1.ComparableComparable是放在自定义数据类型内部,所定义数据类型需要继承此接口,并重写其内部CompareTo方法,实现自定义排序;2.ComparatorComparator自定义排序是写在主函数内部的一个对象,可以实例化,但在实例化时需要实现其内部的Compare方法;3.注意事项1.实例化时需要指明其节点类型2.调用方法//调用自定义排序方法 Collections.sort(list_one); /原创 2020-11-12 19:50:57 · 1136 阅读 · 0 评论 -
并查集概述
概述:并查集是一种自定义数据结构,它主要处理一些不相交集合的合并问题;主要采用数组实现逻辑上的树形结构,数组习惯上命名parent[]用于记录某节点的父节点;经常采用三步走策略:初始化:将某结点的父节点初始化为自己本身,即本身是一个独立的集合,此信息也是判断有几个集合的重要依据;合并:是将两个结点合并为同一个“树”中;查找:给定某个结点,查找的该节点的“树形”根节点;也是用于判断两个结点是否为同一个“树”(集合)中(如果两个节点的根节点相同,则两个节点处于同一个集合中);结合例题,给出原创 2020-07-29 10:34:26 · 107 阅读 · 0 评论 -
(详解)区间DP —— 平行四边形优化
本文从普通区间dp、平行四边形优化区间dp、例题三个步骤,详细分析了区间动态规划!!!编写不宜,希望各位兄台耐心阅读完整!!!1.区间dp区间dp其实就是一种建立在线性结构上的整体上对区间的动态规划区间上dp,大多数题目的状态都是由区间(类似于dp[l][r]这种形式)构成的,就是我们可以把大区间转化成小区间来处理,然后对小区间递推处理求出大区间的值,主要的方法有两种,记忆化搜索和递推。区间DP模版(三要素):区间长度区间起点、终点(由长度与起点推出终点、最后一个起点的位置)分割原创 2020-07-24 22:20:13 · 1935 阅读 · 4 评论 -
java 实现 LIS(最长递增子序列)
1.动态规划思想子问题: 子问题必须具有无后效性的性质,即 当前若干个值一旦确定后,此后过程的演变只与这若干个状态的值有关,和之前采用那种手段或经过哪条路径演变到当前若干个状态无关。 此问题的子问题为:将问题划分为以每个元素为终点的最大上升子序列,然后求取最大值;状态: dp[i]表示以脚标i结尾的元素为终点的最大上升子序列,这样通过dp数组记录以每个元素结尾的上升的最大子序列,返回dp数组中的最大值,即为最大上升子序列;初始状态: 将dp[i]的每个元素置为1,表示在初始原创 2020-07-15 11:52:45 · 348 阅读 · 0 评论 -
贪心算法、动态规划(解题步骤、区别联系)
1.贪心算法一般求解思路贪心点:贪心算法即贪心选择策略(判断怎么选择才能做到每一次选择达到局部最优,即找到贪心点)排序:贪心问题一般都涉及到排序(Comparable、Comparator),通常可能会涉及到两个选择属性自定义排序选择:在排好序进行选择时,通常会选择满足可行解中最小的解,将更大的可行解保留用于解决之后的选择(既做到了局部最优,又有保留的将更有利的的解留到了后续选择中,做到了贪心)辅助:常利用数组记录进行局部选择时满足可行解的个数或顺序位置...原创 2020-07-11 22:50:13 · 1695 阅读 · 1 评论 -
求解钓鱼问题
这个问题比较有韵味,可以好好体会以下!!!问题描述:某人想在h小时内钓到数量最多的鱼。这时他已经在一条路边,从他所在的地方开始,放眼望去,n个湖一字排开,湖编号依次是1.2…n。他已经知道,从湖i走到湖i+1需要花5*ti分钟;他在湖i钓鱼,第一个5分钟可钓到数量为fi的鱼,若他继续在湖i钓鱼,每过5分钟,钓鱼量将减少di。请给他设计一个最佳钓鱼方案。解决思想:解决思想有一些贪心的思想,但主要还是暴力枚举用Lake[i]记录以第 i 个湖结尾的方案,Lake中为结构体,记录以此方案结尾所能获得原创 2020-11-30 21:51:28 · 2302 阅读 · 3 评论 -
任务分配
问题描述:任务分配:有n个人做n个任务,每个人做不同任务的 花费 不同求解:n个人做n个任务所花费的最小值输入:第一行输入n(即多少个人)接下来每行输入n个整数,表示第i个人完成第j个任务的花费输出:输出最优方案数与最小花费解决思想:通过c++库函数 next_permutation(b+1,b+n+1) (b为数组,此函数可以将数组内的数据进行全排列!!!)对人的序列进行全排列,求出最小花费,采用另一个一维数组记录序列(角标表示任务,存储的值表示做此任务的人)代码中有详细的注释解释原创 2020-11-29 20:11:17 · 646 阅读 · 0 评论 -
多项式求和
问题描述:求解n次多项式之和;第一行输入两个数,n(多项式最高项),x(表示具体所求多项式的值,即带入计算的值)第二行输入n+1个数,表示多项式系数输出:多项式结果解决思想:多项式求值 1.p(0)=a[n]2.p(i)=p(i-1)*x+a[n-i]依次迭代递归计算样例输入:3 21 2 3 4样例输出26AC代码(c++):#include<bits/stdc++.h>using namespace std;/*多项式求值 1.p(0)=a[n]原创 2020-10-29 12:02:24 · 2968 阅读 · 0 评论 -
幻方(奇数)——数字填充矩阵
问题描述:输入一个数字n,使1~n*n数字填充在n阶矩阵中,使n阶矩阵水平、竖直、对角线数字相加之和相同;eg:输入3,输出3阶矩阵解决思想:*题目要求n为奇数 *1.首先数字1放在第一排中间:(n+1)/2 2.如果数字在第一行但是不在最后一列,则它下一个元素放在 上一个元素 下一列的最后一行 3.如果数字在最后一列但是不在第一行,则下一个元素放在其上一行的第一列4.如果数字在第一行且在最后一列,则下一个元素放在其正下方5.如果数字不在第一行也不在最后一列,则看其右上方是否有元素原创 2020-10-29 11:54:33 · 384 阅读 · 0 评论 -
自定义数字排序(C++)
问题描述:给定n个整数,统计出每个数字出现的次数,按照出现次数从多到少的顺序输出。输入:输入第一行包含一个整数n,表示给定数字的个数;第二行包含n个整数,相邻整数之间用一个空格分隔,表示所给定的整数;输出:输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的次数,按出现次数的递减顺序输出。(如果出现次数一样多,则先输出次数较小的,其次输出较大的数)样例输入:125 2 3 3 1 3 4 2 5 2 3 5样例输出:3 42 35 31 14 1解决思想:自定义重原创 2020-10-29 11:46:48 · 334 阅读 · 0 评论 -
n阶螺旋矩阵
问题描述:输入一个n,使其按照螺旋的方式输出解决思想:1.对螺旋矩阵进行划分,找出n、i、j之间的关系2.i表示的是循环次数,即旋转到第几圈;j用于表示当前所在的 **`行或列`**; 用固定的数值与j打配合,表示存储的位置;3.setw(n):占固定位数输出4.奇偶数字不同:奇数多出n*n存放在中间位置,a[(n+1)/2][(n+1)/2]=cnt;样例输入:4样例输出: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7原创 2020-10-22 12:07:44 · 1178 阅读 · 0 评论 -
N皇后问题
问题描述:在n*n棋盘上,每一行放置一个皇后;要求所有皇后所处位置:不同行、不同列、不同对角线;解决思想:1.使用q[N]一维数据存放皇后位置:q[2]=3:表示皇后放置在第2行第3列2.打印可以直接在某次直接调用后执行:show()样例输入:6样例输出:方案1 [1 2] [2 4] [3 6] [4 1] [5 3] [6 5]方案2 [1 3] [2 6] [3 2] [4 5] [5 1] [6 4]方案3 [1 4] [2 1] [3 5] [4 2] [5 6] [原创 2020-10-22 11:52:16 · 82 阅读 · 0 评论