递推和递归_递推与递归

本文介绍了递推与递归思想在解决IOI竞赛问题中的重要性,通过数楼梯和外星密码两个例子阐述了递推与递归的解题方法。数楼梯问题展示了不同上楼方式的计数,而外星密码问题则涉及到字符串的解压缩,两者都是动态规划和分治策略的基础。
摘要由CSDN通过智能技术生成

题单简介

有些目标是宏大的,比如要在 IOI 赛场中得到满分(俗称 AK IOI)。如果你现在还是一个普通的学生,那么想达成这个目标太难了。但把这样宏大的目标分解为很多个子任务,就没觉得那么复杂了。

要想 AK IOI,只需要入选国家队,参加 IOI 即可。那怎么成为入选国家队呢?参加中国队选拔赛并通过面试答辩即可。使用同样的思路往前倒推,直到最后只剩下最基础的任务(比如认真的读完这章内容并完成练习),做完这样的小任务就很简单了。

像这样将一个很大的任务分解成规模小一些的子任务,子任务分成更小的子任务,直到遇到初始条件,最后整理归纳解决大任务的思想就是递推与递归思想,不过这两者还是有一些区别。

这一章涉及的内容是动态规划思想与分治策略的基础,大家也要认真学习啦,说不定目标就真的达到了。

940a7926508d1341aa18e77ef6d0414b.png

1. 数楼梯

题目描述

楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

输入输出样例

输入 #1

4

输出 #1

5

说明/提示

对于 60% 的数据,N≤50
对于 100% 的数据,N≤5000。

50分题解(int)

#include#include#include#include#include#include#include#include#includeusing namespace std;int dp[5005];int main(){    int n;    cin>>n;    switch(n)    {        case 1:cout<<1;exit(0);        case 2:cout<<2;exit(0);     }    dp[0]=0;    dp[1]=1;    dp[2]=2;    for(int i=3;i<=n;i++)     {        dp[i]=dp[i-1]+dp[i-2];    }    cout<    return 0;}

60分题解(long long)

#include#include#include#include#include#include#include#include#includeusing namespace std;long long dp[5005];int main(){    long long n;    cin>>n;    switch(n)    {        case 1:cout<<1;exit(0);        case 2:cout<<2;exit(0);     }    dp[0]=0;    dp[1]=1;    dp[2]=2;    for(int i=3;i<=n;i++)     {        dp[i]=dp[i-1]+dp[i-2];    }    cout<    return 0;}

100分代码

#include#include#include#include#includeusing namespace std;string f(string a,string b){    int x[2005],y[2005];    int c[2005];    memset(x,0,sizeof(x));    memset(y,0,sizeof(y));    memset(c,0,sizeof(c));    reverse(a.begin(), a.end());    reverse(b.begin(), b.end());     for(int i=0;i    {        x[i]=a[i]-'0';    }    for(int i=0;i    {        y[i]=b[i]-'0';    }    for(int i=0;i    {        c[i]+=x[i]+y[i];        c[i+1]+=c[i]/10;        c[i]%=10;    }    bool f=0;    string q="";    for(int i=max(a.size(),b.size());i>=0;i--)    {        if(c[i]!=0||i==0)        {            f=1;        }        if(f==1)        {            q+=c[i]%10+'0';        }    }    return q;}int main(){    int n;    cin>>n;    if(n==0)    {        cout<<0;        return 0;    }    string mm="1";    string nn="1";    n--;    while(n--)    {        string qq=f(mm,nn);        mm=nn;        nn=qq;    }    cout<}

2.外星密码

题目描述

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

输入格式

第一行:一个字符串

输出格式

第一行:一个字符串

输入输出样例

输入 #1

AC[3FUN]

输出 #1

ACFUNFUNFUN

说明/提示

【数据范围】

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

对于 100%的数据:解压后的字符串长度在 20000 以内,最多只有十重压缩。

对于 100%的数据:保证只包含数字、大写字母、’[‘和’]‘

代码

#includeusing namespace std;string read(){    int n;    string s="",s1;    char c;    while (cin>>c)    {        if (c=='[')        {            cin>>n;            s1=read();            while (n--) s+=s1;        }        else         {            if (c==']') return s;            else s+=c;        }    }}int main(){    cout<    return 0;}

beb4816640e50d3f992d6a82b4bb4bcd.png


	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值