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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效