WHR_39 2022-12-25 23:04 采纳率: 100%
浏览 54
已结题

c++跳楼梯问题递归超时

c++跳楼梯问题如下

img


然后我用一个函数,以 j 计数,用递归解决,代码如下

#include <bits/stdc++.h>
using namespace std;
void cs(int n,int &j)
{
    if(n==2||n==3)
    {
        j++;
        j=j%1000000007;
        return;
    }
    else if(n<2)
    {
        return;
    }
    if(n%2==0)
    {
        cs(n-1,j);
        cs(n-2,j);
    }
    else
    {
        cs(n-3,j);
        cs(n-4,j);
    }
}
int main()
{
    int n,j=0;
    cin>>n;
    cs(n,j);
    cout<<j;
    return 0;
}

但是提交后它超时了

img


它数据太大了,以这种方法就显得力不从心。
请问有什么更快的解决方法吗?

  • 写回答

2条回答 默认 最新

  • ksgpjhqf 2022-12-26 10:47
    关注

    递归效率比较低,可以用动态规划。大概思路:定义数组a[n],用于存放方案数,a[2]和a[3]赋值1,其余为0。i从4到n遍历,根据i的奇偶性,将a[i]赋值为a[i-1]+a[i-2],或者a[i-3]+a[i-4]。
    c代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    void cs(int n, int &j) {
        if (n > 3) {
            int a[n] = {0, 1, 1}, i;
            for (i = 4; i <= n; i++) {
                if (i % 2) {
                    a[i - 1] = (a[i - 4] + a[i - 5]) % 1000000007;
                } else {
                    a[i - 1] = (a[i - 2] + a[i - 3]) % 1000000007;
                }
            }
            j= a[n - 1];
        }else{
            j= n<2?0:1;
        }
    }
    
    int main() {
        int n,j;
        cin >> n;
        cs(n,j);
        cout << j;
        return 0;
    }
    
    

    执行结果:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月25日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度