![](https://img-blog.csdnimg.cn/20190927151117521.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
栈与递归
栈及其变体,如单调栈等
hnjzsyjyj
这个作者很懒,什么都没留下…
展开
-
洛谷 P1095 [NOIP2007 普及组 T4]:Hanoi 双塔问题 ← 递归+高精度算法
● 设 f[i] 为将 2*i 个圆盘从 A 柱移动到 C 柱的移动次数。则将 2*i 个圆盘从 A 柱移动到 C 柱,需要如下 3 步:(1)将 2*(i-1) 个圆盘从 A 柱移动到 B 柱,需要移动 f[i-1] 次。(2)将 2 个圆盘从 A 柱移动到 C 柱,需要移动 2 次。(3)将 2*(i-1) 个圆盘从 B 柱移动到 C 柱,需要移动 f[i-1] 次。综上,f[i]=2*f[i-1]+2。初始状态为 f[1]=2。原创 2024-07-14 19:12:12 · 930 阅读 · 0 评论 -
AcWing 476:对称二叉树
基本思路:(1)以二叉树的每一个结点为根结点,寻找对称二叉树。(2)统计找到的对称二叉树的结点数。(3)比较获得最大的结点数。原创 2024-05-30 11:44:47 · 282 阅读 · 0 评论 -
HDU 1100:Trees Made to Order ← 卡特兰数
本题大意:给定一个二叉树的排序规则,之后输入一个序号,然后按格式约定输出这个序号所对应的二叉树。本题给出的二叉树的排序规则如下:(1)结点个数多的二叉树,序号更“大”;(2)结点个数一样的二叉树,左子树高度高的二叉树,序号更“大”;(3)结点个数一样的二叉树,左子树相同,右子数高度高的二叉树,序号更“大”。原创 2024-03-29 13:51:19 · 931 阅读 · 0 评论 -
“辗转相除法”求最大公约数 ← 递归
“辗转相除法”求最大公约数 ← 递归原创 2024-02-24 22:07:20 · 512 阅读 · 0 评论 -
“更相减损法”求最大公约数 ← 非递归
更相减损法求最大公约数 ← 非递归原创 2024-02-24 21:55:49 · 1130 阅读 · 0 评论 -
AcWing 872:最大公约数 ← 递归及非递归解法等
求最大公约数常见的3种算法:辗转相除法 ← 递归更相减损法 ← 非递归利用 algorithm 包中自带的函数 __gcd()原创 2024-02-24 21:40:21 · 557 阅读 · 1 评论 -
十进制转二进制的算法代码 ← 栈
为了学习栈的性质,本文给出了利用栈实现十进制转为二进制的代码。关于栈的代码实现,可参见:https://blog.csdn.net/hnjzsyjyj/article/details/130522133而将十进制转换为任意进制的算法代码,可参见:https://blog.csdn.net/hnjzsyjyj/article/details/112596698原创 2023-10-07 14:23:13 · 578 阅读 · 1 评论 -
洛谷P8815:逻辑表达式 ← CSP-J 2022 复赛第3题
分治法思想原创 2023-09-23 23:10:18 · 153 阅读 · 0 评论 -
洛谷 P1928 外星密码 <- 递归
【问题描述】有了防护伞,并不能完全避免 2012 的灾难。地球防卫小队决定去求助外星种族的帮助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压缩密码,外星人对于连续的若干个相同的子串“X”会压缩为“[DX]”的形式(D 是一个整数且 1≤D≤99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2CB]]]原创 2021-08-16 23:02:59 · 137 阅读 · 0 评论 -
最大子段和 - 洛谷P1115 ← 分治法
给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。原创 2023-02-28 13:13:23 · 202 阅读 · 0 评论 -
俄式乘法 ← 减治法
俄式乘法(Russian multiplication)用来计算两个正整数n和m的乘积,运算规则是: 如果n是偶数,计算n/2×2m; 如果n是奇数,计算(n-1)/2×2m+m; 当n等于1时,返回m的值。 据说19世纪的俄国农夫使用该算法并因此得名,这个算法也使得乘法的硬件实现速度非常快,因为只使用移位就可以完成二进制数的折半和加倍。原创 2023-03-01 22:41:45 · 509 阅读 · 1 评论 -
最大公约数及最小公倍数之递归实现
【算法代码】#include <bits/stdc++.h>using namespace std;int gcd(int a,int b){ if(a%b==0) return b; return gcd(b,a%b); }int main() { int a,b; cin>>a>>b; cout<<gcd(a,b)<<endl; //greatest common divisor(gcd) cout<<原创 2020-12-06 12:32:07 · 529 阅读 · 1 评论 -
上楼梯的走法 ← 递归
楼梯有n阶台阶,上楼可以一步上1阶,2阶或3阶,编程计算共有多少种不同的走法?原创 2023-04-09 18:31:36 · 97 阅读 · 0 评论 -
递归算法求1~100的和
【算法代码】#include <bits/stdc++.h>using namespace std;int qiuhe(int n){ if(n==1) return 1; return qiuhe(n-1)+n;}int main() { int x; cin>>x; cout<<qiuhe(x)<<endl; return 0;}原创 2021-07-07 21:13:48 · 670 阅读 · 1 评论 -
九连环 ← 递归
九连环游戏的历史非常悠久,据说起源于战国时期。九连环由九个相互连接的环组成,这九个环套在一个中空的长形柄中。九连环的玩法是要将这九个环从柄上解下来。解下所有九个环需要解341步,因此人们需要有耐心。原创 2021-09-24 21:01:40 · 2285 阅读 · 3 评论 -
分成互质组 递归
【问题描述】给定 n 个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?【算法分析】判断两个数互质,一种经典解决方法是求两个数的最大公约数。利用辗转相除法求最大公约数的代码如下:#include <bits/stdc++.h>using namespace std; int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b); } int main() { int a,b; ci原创 2021-07-16 15:43:15 · 390 阅读 · 0 评论 -
洛谷 U91193:棋盘覆盖问题 ← 分治法
洛谷 U91193 棋盘覆盖:在一个2^k * 2^k(k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格。现在用4种不同形状的 L型(占3小格)骨牌覆盖棋盘上除了特殊方格以外的所有方格,且各骨牌不能重叠。 步骤为:将棋盘一分为四,依次处理左上角,右上角,左下角,右下角,递归进行。严格按照这个顺序处理。原创 2023-02-28 21:03:50 · 1114 阅读 · 2 评论 -
归并排序 <-- 递归思想 分治思想 C++
【算法分析】归并算法基于分治策略,分治策略利用递归实现。归并排序理解之后,可以解决“小和问题”、“逆序对问题”等经典问题。下文归并排序的动画来源于:https://blog.csdn.net/kevinmeanscool/article/details/87916085【算法代码】#include <bits/stdc++.h>using namespace std;void merge(vector<int> &v, int low, int mid, i原创 2021-08-17 17:28:06 · 228 阅读 · 0 评论 -
2011考研题:求两个等长升序序列的中位数 ← 减治法
求两个等长升序序列的中位数 ← 减治法原创 2023-03-02 18:48:05 · 653 阅读 · 0 评论 -
手推汉诺塔执行过程(n=3)
【手推汉诺塔执行过程(n=3)示意图】原创 2021-08-10 09:26:52 · 348 阅读 · 1 评论 -
NOIP 2018 普及组初赛之程序完善题T1
(最大公约数之和)下列程序想要求解整数𝑛所有约数两两之间最大公约数的和对10007求余后的值,试补全程序。原创 2021-08-09 18:40:17 · 804 阅读 · 0 评论 -
邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导
难点在于推出 C(k) 及 F(k)=2F(k-1) 两个递推式。原创 2023-09-22 09:23:07 · 249 阅读 · 0 评论 -
P1087 [NOIP2004 普及组第三题] FBI 树
FBI树是一种二叉树,它的结点类型包括F结点,B结点和I结点三种。原创 2022-07-17 15:55:17 · 745 阅读 · 0 评论 -
汉诺塔问题
【算法描述】汉诺塔(Tower of Hanoi)问题源于印度传说。话说大梵天创造世界时造了三根金钢石柱子(假设为A、B、C),其中一根柱子(假设为A)自底向上叠着64片大小不同的黄金圆盘。有一天,大梵天命令婆罗门把圆盘从A柱移动C柱上。并且规定,在柱子间移动圆盘时,每次只能移动一个圆盘,且任何时候大圆盘不能放在小圆盘上。请给出算法代码。 【算法分析】运用递归思想,可以高效简洁地解决问题。其核心是递归函数的设计。而递归函数设计的关键是将“大问题拆分成小问题”形式化。比如,汉诺塔问题要求将..原创 2021-04-01 16:12:52 · 3192 阅读 · 4 评论 -
快速排序 <- 分治思想 递归思想
【算法描述】快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。设要排序的数组是a[1]……a[n],首先任意选取一个数据(通常选用数组的中间数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序原创 2021-08-17 23:42:47 · 144 阅读 · 0 评论 -
扩展欧几里得算法 ← 分治法
给定 n 对正整数 ai,bi,对于每对数,求出一组 xi,yi,使其满足 ai×xi+bi×yi=gcd(ai,bi)。原创 2023-02-28 22:55:17 · 1008 阅读 · 1 评论 -
AcWing 4957:飞机降落
由数据范围反推算法复杂度以及算法内容,参见:https://www.acwing.com/blog/content/32/原创 2023-08-08 23:13:09 · 105 阅读 · 0 评论 -
利用数组模拟栈,实现逆序输出。
利用数组模拟栈,实现逆序输出。注意top初始取-1或0时,代码的差异。原创 2023-05-06 11:21:12 · 831 阅读 · 0 评论 -
中缀表达式转后缀表达式 ← C++实现
简单而言,将中缀表达式转换为后缀表达式的算法需要注意以下两点。● 操作数始终入操作数栈。● 操作符入操作符栈时,比较与操作符栈的栈顶元素的优先级,然后选择入操作符栈还是入操作数栈。直至将操作符栈的所有元素入操作数栈后,终止算法。若设操作符栈的栈顶元素为top,新来的操作符为new,则此步算法可形式化为:if(newtop) {push new to 操作符栈}原创 2022-10-09 21:39:39 · 661 阅读 · 0 评论 -
括号匹配问题 ← 栈
此题算法给出了利用顺序栈求解相关问题的模板,值得探究学习。其中:初始时栈顶指针根据需要设为top=-1;,这也是判断栈为空的条件。入栈操作语句为s[++top]=…;出栈操作语句为top--;输出栈顶元素语句为cout原创 2022-09-23 16:54:30 · 291 阅读 · 0 评论 -
进制转换之十进制数转八进制数 ← 栈
此题十分简单。但此题算法给出了利用顺序栈求解相关问题的模板,值得探究学习。其中:初始时栈顶指针 top=0;入栈操作语句为 s[++top]=n%8;出栈操作语句为 top--;输出栈顶元素语句为cout原创 2022-09-23 15:14:01 · 357 阅读 · 0 评论 -
车厢调度问题 ← 栈
由于车厢按照编号 1~n 依次入栈,因此,若车厢 x 准备入栈,那么车厢 1 ~ x-1 都已入栈,所以不可能出现栈中元素大于车厢 x 的情况。原创 2022-09-23 08:33:31 · 557 阅读 · 0 评论 -
判断是否为回文字符串 ← 栈
所谓回文字符串就是指正读反读均相同的字符序列。 如“123a321”和“aba”均是回文,但“abc”不是回文。 通过栈这个数据结构我们将很容易判断一个字符串是否为回文。原创 2022-09-16 15:18:24 · 603 阅读 · 0 评论 -
求1~10的和 ← 利用STL stack
【算法分析】本例目的主要是练习 STL stack 中各常用的函数(如push()、pop()、top()、empty() 等)的用法。而且,利用 STL stack 的优势之一,是可以方便的在信息学竞赛中快速构建栈,而不必自己手写栈。【算法代码】#include<bits/stdc++.h>using namespace std; int main () { stack<int> mystack; int sum=0; for(int i=1; i<=1原创 2022-04-16 09:44:40 · 420 阅读 · 0 评论 -
hdu 1062:Text Reverse
【Problem】Ignatius likes to write words in reverse way. Given a single line of text which is written by Ignatius, you should reverse all the words and then output them.【Input】The input contains several test cases. The first line of the input is a single i原创 2022-04-16 08:54:11 · 259 阅读 · 0 评论 -
洛谷P1739:表达式括号匹配 ← 利用STL stack
【题目链接】https://www.luogu.com.cn/problem/P1739【问题描述】假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。【输入格式】一行:表达式【输出格式】一行:“YES” 或“NO”【输入输出样例】输入1:2*(x+y)/(1-x)@输出1:YES输入2:(25+x)*(a原创 2022-04-16 08:29:47 · 177 阅读 · 0 评论 -
利用栈实现逆序输出
【算法代码】#include <bits/stdc++.h>using namespace std;int n,x;int main() { cin>>n; stack<int> s; while(n--) { cin>>x; s.push(x); } while(!s.empty()) { cout<<s.top()<<" ";原创 2021-10-02 20:47:47 · 2702 阅读 · 0 评论 -
单调栈(数组模拟)
【题目描述】给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出−1。【输入格式】第一行输入一个整数N,表示数列长度。第二行输入N个整数,表示数列中各个元素值。【输出格式】共一行,包含N个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存在则输出−1。【数据范围】1≤N≤1000001≤数列中元素≤1000000000【样例】输入样例:53 4 2 7 5输出样例:-1 3 -1 2 2【算法分析】很显然,此题宜选用单调栈进行处理,因为单调栈是一原创 2021-05-21 23:01:28 · 599 阅读 · 0 评论 -
AcWing 830:单调栈(STL stack)
● 单调栈是一种非常适合处理“下一个更大元素(Next Greater Number)”问题的数据结构。原创 2021-05-28 18:04:27 · 608 阅读 · 1 评论 -
LeetCode刷题:视野总和(单调栈 数组模拟)
【问题描述】有n个人站队,所有的人全部向右看,个子高的可以看到个子低的发型。给出每个人的身高,问所有人能看到其他人发现总和是多少?【输入输出】输入:4 3 7 1输出:2【算法分析】观察题目之后,发现问题可以转化为由当前数字向右查找到第一个大于它的数字之间有多少个数字。之后,将各个结果累加就是答案。本质上可以转化为利用单调栈进行求解。【算法代码】#include <bits/stdc++.h>using namespace std;const ..原创 2021-05-28 19:18:51 · 904 阅读 · 0 评论