递归和递推

news/2025/2/20 3:02:49/

文章目录

  • 数楼梯
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
  • [NOIP2002 普及组] 过河卒
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
  • [NOIP2003 普及组] 栈
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
  • [NOIP2001 普及组] 数的计算
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 样例 1 解释
      • 数据规模与约定
      • 说明
  • Function
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 数据规模与约定
  • 外星密码
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示

在这里插入图片描述

数楼梯

题目描述

楼梯有 N N N 阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

样例 #1

样例输入 #1

4

样例输出 #1

5

提示

  • 对于 60 % 60\% 60% 的数据, N ≤ 50 N \leq 50 N50
  • 对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 5000 1 \le N \leq 5000 1N5000
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>using namespace std;#define maxn 1700struct Bigint {int len, a[maxn];Bigint(int x = 0) {memset(a, 0, sizeof(a));for (len = 1; x; len++)static_cast<void>(a[len] = x % 10), x /= 10;len--;}int& operator[](int i) {return a[i];}void flatten(int L) {len = L;for (int i = 1; i <= len; i++) {a[i + 1] += a[i] / 10;a[i] %= 10;}for (;  !a[len];) len--;}void print() {for (int i = max(len, 1); i >= 1; i--)printf("%d", a[i]);}
};Bigint operator+(Bigint a, Bigint b) {Bigint c;int len = max(a.len, b.len);for (int i = 1; i <= len; i++)c[i] += a[i] + b[i];c.flatten(len + 1);return c;
}int main() {int N;cin >> N;Bigint f[5010];f[1] = Bigint(1);f[2] = Bigint(2);for (int i = 3; i <= N; i++)f[i] = f[i - 2] + f[i - 1];f[N].print();return 0;
}

[NOIP2002 普及组] 过河卒

题目描述

棋盘上 A A A 点有一个过河卒,需要走到目标 B B B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C C C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

棋盘用坐标表示, A A A ( 0 , 0 ) (0, 0) (0,0) B B B ( n , m ) (n, m) (n,m),同样马的位置坐标是需要给出的。

现在要求你计算出卒从 A A A 点能够到达 B B B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

输入格式

一行四个正整数,分别表示 B B B 点坐标和马的坐标。

输出格式

一个整数,表示所有的路径条数。

样例 #1

样例输入 #1

6 6 3 3

样例输出 #1

6

提示

对于 100 % 100 \% 100% 的数据, 1 ≤ n , m ≤ 20 1 \le n, m \le 20 1n,m20 0 ≤ 0 \le 0 马的坐标 ≤ 20 \le 20 20

【题目来源】

NOIP 2002 普及组第四题

#include <iostream>
#define NAXN 22
using namespace std;int ctrl[NAXN][NAXN];
int n, m, hx, hy;
long long f[NAXN][NAXN] = {0};
int dx[9][2] = {{0,0},{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
//马的控制范围相对于马位置的偏移int main(){cin >> n >> m >> hx >> hy;for (int i = 0; i < 9; i++){int tmpx = hx + dx[i][0];int tmpy = hy + dx[i][1];//判断在棋盘范围内if (tmpx >= 0 && tmpx <= n && tmpy >= 0 && tmpy <= m){ctrl[tmpx][tmpy]=1;//记录马的控制点}}f[0][0] = 1 - ctrl[0][0];  //若原点就是马控制点,则初始路径数量就是0,否则是1for (int i = 0; i <= n; i++){for (int j = 0; j <= m; j++){if(ctrl[i][j]) continue;//若这个点是控制点,则跳过if (i != 0) f[i][j] += f[i - 1][j]; //若不在横轴上,上面路径数加上if (j != 0) f[i][j] += f[i][j - 1]; //若不在纵轴上,左边路径数加上}}cout << f[n][m];//输出答案return 0;
}

[NOIP2003 普及组] 栈

题目背景

栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。

栈有两种最重要的操作,即 pop(从栈顶弹出一个元素)和 push(将一个元素进栈)。

栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。

题目描述

宁宁考虑的是这样一个问题:一个操作数序列, 1 , 2 , … , n 1,2,\ldots ,n 1,2,,n(图示为 1 到 3 的情况),栈 A 的深度大于 n n n

现在可以进行两种操作,

  1. 将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 push 操作)
  2. 将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 pop 操作)

使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 1 2 3 生成序列 2 3 1 的过程。

(原始状态如上图所示)

你的程序将对给定的 n n n,计算并输出由操作数序列 1 , 2 , … , n 1,2,\ldots,n 1,2,,n 经过操作可能得到的输出序列的总数。

输入格式

输入文件只含一个整数 n n n 1 ≤ n ≤ 18 1 \leq n \leq 18 1n18)。

输出格式

输出文件只有一行,即可能输出序列的总数目。

样例 #1

样例输入 #1

3

样例输出 #1

5

提示

【题目来源】

NOIP 2003 普及组第三题

#include<cstdio>using namespace std;int main(){int n,h[20]={1,1};scanf("%d",&n);for(int i=2;i<=n;i++)for(int j=0;j<i;j++)h[i] += h[j]*h[i-j-1];printf("%d",h[n]);return 0;
}

[NOIP2001 普及组] 数的计算

题目描述

给出正整数 n n n,要求按如下方式构造数列:

  1. 只有一个数字 n n n 的数列是一个合法的数列。
  2. 在一个合法的数列的末尾加入一个正整数,但是这个正整数不能超过该数列最后一项的一半,可以得到一个新的合法数列。

请你求出,一共有多少个合法的数列。两个合法数列 a , b a, b a,b 不同当且仅当两数列长度不同或存在一个正整数 i ≤ ∣ a ∣ i \leq |a| ia,使得 a i ≠ b i a_i \neq b_i ai=bi

输入格式

输入只有一行一个整数,表示 n n n

输出格式

输出一行一个整数,表示合法的数列个数。

样例 #1

样例输入 #1

6

样例输出 #1

6

提示

样例 1 解释

满足条件的数列为:

  • 6 6 6
  • 6 , 1 6, 1 6,1
  • 6 , 2 6, 2 6,2
  • 6 , 3 6, 3 6,3
  • 6 , 2 , 1 6, 2, 1 6,2,1
  • 6 , 3 , 1 6, 3, 1 6,3,1

数据规模与约定

对于全部的测试点,保证 1 ≤ n ≤ 1 0 3 1 \leq n \leq 10^3 1n103

说明

本题数据来源是 NOIP 2001 普及组第一题,但是原题的题面描述和数据不符,故对题面进行了修改,使之符合数据。原题面如下,谨供参考:

我们要求找出具有下列性质数的个数(包含输入的正整数 n n n)。

先输入一个正整数 n n n n ≤ 1000 n \le 1000 n1000),然后对此正整数按照如下方法进行处理:

  1. 不作任何处理;
  2. 在它的左边拼接一个正整数,但该正整数不能超过原数,或者是上一个被拼接的数的一半;
  3. 加上数后,继续按此规则进行处理,直到不能再加正整数为止。

感谢 @dbxxx 对本题情况的反馈,原题面的问题见本贴。

#include<iostream>
#include<cstring>using namespace std;int n,f[1010];int sol(int x){int ans = 1;if(f[x]!=-1)return f[x];for(int i=1;i<=x/2;i++)ans+=sol(i);return f[x] = ans;
}int main(){cin>>n;memset(f,-1,sizeof(f));f[1]=1;cout<<sol(n)<<endl;return 0;
}

Function

题目描述

对于一个递归函数 w ( a , b , c ) w(a,b,c) w(a,b,c)

  • 如果 a ≤ 0 a \le 0 a0 b ≤ 0 b \le 0 b0 c ≤ 0 c \le 0 c0 就返回值$ 1$。
  • 如果 a > 20 a>20 a>20 b > 20 b>20 b>20 c > 20 c>20 c>20 就返回 w ( 20 , 20 , 20 ) w(20,20,20) w(20,20,20)
  • 如果 a < b a<b a<b 并且 b < c b<c b<c 就返回$ w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)$。
  • 其它的情况就返回 w ( a − 1 , b , c ) + w ( a − 1 , b − 1 , c ) + w ( a − 1 , b , c − 1 ) − w ( a − 1 , b − 1 , c − 1 ) w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1) w(a1,b,c)+w(a1,b1,c)+w(a1,b,c1)w(a1,b1,c1)

这是个简单的递归函数,但实现起来可能会有些问题。当 a , b , c a,b,c a,b,c 均为 15 15 15 时,调用的次数将非常的多。你要想个办法才行。

注意:例如 w ( 30 , − 1 , 0 ) w(30,-1,0) w(30,1,0) 又满足条件 1 1 1 又满足条件 2 2 2,请按照最上面的条件来算,答案为 1 1 1

输入格式

会有若干行。

并以 − 1 , − 1 , − 1 -1,-1,-1 1,1,1 结束。

输出格式

输出若干行,每一行格式:

w(a, b, c) = ans

注意空格。

样例 #1

样例输入 #1

1 1 1
2 2 2
-1 -1 -1

样例输出 #1

w(1, 1, 1) = 2
w(2, 2, 2) = 4

提示

数据规模与约定

保证输入的数在 [ − 9223372036854775808 , 9223372036854775807 ] [-9223372036854775808,9223372036854775807] [9223372036854775808,9223372036854775807] 之间,并且是整数。

保证不包括 − 1 , − 1 , − 1 -1, -1, -1 1,1,1 的输入行数 T T T 满足 1 ≤ T ≤ 1 0 5 1 \leq T \leq 10 ^ 5 1T105

#include <iostream>
using namespace std;long long f[25][25][25];long long w(long long a, long long b, long long c) {if (a <= 0 || b <= 0 || c <= 0) return 1;else if (a > 20 || b > 20 || c > 20) return w(20, 20, 20);else if (f[a][b][c]!=0)return f[a][b][c];else if (a == b && b < c)f[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);elsef[a][b][c] = w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);return f[a][b][c];
}int main() {long long a, b, c;while (cin >> a >> b >> c) {if (a == -1 && b == -1 && c == -1)break;cout << "w(" << a << ", " << b << ", " << c << ") = ";cout << w(a, b, c) << endl;}return 0;
}

外星密码

题目描述

有了防护伞,并不能完全避免 2012 的灾难。地球防卫小队决定去求助外星种族的帮助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压缩密码,外星人对于连续的若干个相同的子串 X \texttt{X} X 会压缩为 [DX] \texttt{[DX]} [DX] 的形式( D D D 是一个整数且 1 ≤ D ≤ 99 1\leq D\leq99 1D99),比如说字符串 CBCBCBCB \texttt{CBCBCBCB} CBCBCBCB 就压缩为 [4CB] \texttt{[4CB]} [4CB] 或者 [2[2CB]] \texttt{[2[2CB]]} [2[2CB]],类似于后面这种压缩之后再压缩的称为二重压缩。如果是 [2[2[2CB]]] \texttt{[2[2[2CB]]]} [2[2[2CB]]] 则是三重的。现在我们给你外星人发送的密码,请你对其进行解压缩。

输入格式

输入一行,一个字符串,表示外星人发送的密码。

输出格式

输出一行,一个字符串,表示解压缩后的结果。

样例 #1

样例输入 #1

AC[3FUN]

样例输出 #1

ACFUNFUNFUN

提示

【数据范围】

对于 50 % 50\% 50% 的数据:解压后的字符串长度在 1000 1000 1000 以内,最多只有三重压缩。

对于 100 % 100\% 100% 的数据:解压后的字符串长度在 20000 20000 20000 以内,最多只有十重压缩。保证只包含数字、大写字母、[]

#include <iostream>
#include <cstring>
using namespace std;string expand() {string s = "",X;char c;int D;while (cin >> c) { // 持续读入字符,直到全部读完if (c == '[') { // 发现一个压缩区cin >> D; // 读入DX = expand(); // 递归地读入Xwhile (D--)s += X; // 重复D次X并进行拼接} else if (c == ']') {return s; // 压缩区结束,返回已经处理好的s} else {s += c; // 如果不是'['和']',那还是s的字符,加进去即可}}return s;
}int main() {cout << expand();return 0;
}

http://www.ppmy.cn/news/1208665.html

相关文章

2023.11.8 hadoop学习-概述,hdfs dfs的shell命令

目录 1.分布式和集群 2.Hadoop框架 3.版本更新 4.hadoop架构详解 5.页面访问端口 6.Hadoop-HDFS HDFS架构 HDFS副本 7.SHELL命令 8.启动hive服务 1.分布式和集群 分布式: 多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务)集 群:…

UrlBasedCorsConfigurationSource无法转换为CorsConfigurationSource的原因

由于包的问题 cors.reactive和cors中都有UrlBasedCorsConfigurationSource&#xff0c;如果找着尚硅谷老师的思路去做而不是直接复制代码&#xff0c;非常容易出现该问题。 import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.spring…

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

1 数据对象的创建 CtrlH打开Model Explorer&#xff0c;在Base workspace中点击工具栏add&#xff0c;出现如下界面&#xff0c; 可以看到Simulink提供了多种数据类型 Matlab Variable&#xff1a;Simulink.Parameter&#xff1a;使用该数据对象表示工程应用中的标定量Simuli…

okhttp添加公共参数

在项目开发中很多时候后台都会给一些全局的公共入参&#xff0c;比如携带手机信息或者时间戳等字段。而我们在使用okhttp时&#xff0c;就需要我们单独就行二次封装处理了&#xff0c;对于请求全局参数&#xff0c;每次请求都要去写一次&#xff0c;那是肯定不行的。 所以就要我…

k8s ingress基础

一、ingress 简介 在k8s集群中&#xff0c;service和pod的ip为内网ip&#xff0c;仅集群内部才可以访问。如果外部应用想要直接访问集群内的服务&#xff0c;就需要把外部请求通过负载均衡转发到service上&#xff0c;然后再由kube-proxy组件将其转发给后端pod。一般service可…

记一次上位机软件线程泄露的分析及解决

上位机软件在客户现场隔一段时间说操作了没反应&#xff0c;但是上位机又没死&#xff0c;出现了一些奇怪现象&#xff1a; 左上角的时间不走了&#xff08;本来是1s运行一次&#xff09;使用任务管理器查看&#xff0c;内存占用1.5G,线程有3000多个&#xff0c;正常情况下&am…

golang工程中间件——redis常用结构及应用(set,zset)

Redis 命令中心 这些篇文章专门以应用为主&#xff0c;原理性的后续博主复习到的时候再详细阐述 set 集合&#xff0c;为了描述它的特征&#xff0c;我们可称呼为无序集合&#xff1b;集合的特征是唯一&#xff0c;集合中的元素是唯一存在 的&#xff1b; 存储结构 元素都…

想要创建百度百科词条怎么做?

百科词条创建没有大家想象中的那么简单&#xff0c;但是也并不是一件不可完成的事情。首先百科词条创建有很多的规则&#xff0c;然后我们在创建百科词条的时候资料要准备正确&#xff0c;才能保证我们的词条容易审核通过。 百度百科词条创建不是一个一蹴而就的过程&#xff0…