bangbang-ande 发表于 2020-7-29 13:00:51

爬楼梯

本帖最后由 bangbang-ande 于 2020-7-29 17:47 编辑

题目是这样子的:

题目描述
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。

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

输入格式
一个数字,楼梯数。

输出格式
输出走的方式总数。

输入输出样例
输入 #1
4
输出 #1
5
说明/提示
对于 60\%60% 的数据,N≤50;
对于 100\%100% 的数据,N≤5000。

然后写的代码是这样的:
#include <stdio.h>

int ans = 0;

int f(int n){
    if(n == 1){
      ans += 1;
      return 0;
    }
    if(n == 2){
      ans += 2;
      return 0;
    }
    f(n - 1);
    f(n - 2);
}

int main(){
    int n;
    scanf("%d", &n);
    f(n);
    printf("%d", ans);
}
可是运行起来是四个通过,剩下的超了时间(时间复杂度1s, 空间复杂度125mb)
然后又改了一下:
#include <stdio.h>

int ans = 0;

int f(int n){
    if(n == 1 && n == 2){
      ans += 1;
      return 0;
    }
    f(n - 1);
    f(n - 2);
}

int main(){
    int n;
    scanf("%d", &n);
    f(n - 1);
    printf("%d", ans);
}
结果空间复杂度又出问题。。。
请问还有没有更好的方法?

可以来下边那个网站测试
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
题目网站:https://www.luogu.com.cn/problem/P1255

Seawolf 发表于 2020-7-29 13:04:29

public int climbStairs(int n) {
    // base cases
    if(n <= 0) return 0;
    if(n == 1) return 1;
    if(n == 2) return 2;
   
    int one_step_before = 2;
    int two_steps_before = 1;
    int all_ways = 0;
   
    for(int i=2; i<n; i++){
        all_ways = one_step_before + two_steps_before;
        two_steps_before = one_step_before;
        one_step_before = all_ways;
    }
    return all_ways;
}

xiaosi4081 发表于 2020-7-29 13:46:53

你应该不是时间复杂度出问题,是最后忘了return了(结果报错了),还有你这个f函数不用返回值呀
#include <stdio.h>

int ans = 0;
void f(int n){
   
    if(n == 1 && n == 2){
      ans += 1;
      return;
    }
    f(n - 1);
    f(n - 2);
    return;
}

int main(){
    int n;
    scanf("%d", &n);
    f(n - 1);
    printf("%d", ans);
}

bangbang-ande 发表于 2020-7-29 15:11:42

xiaosi4081 发表于 2020-7-29 13:46
你应该不是时间复杂度出问题,是最后忘了return了(结果报错了),还有你这个f函数不用返回值呀

但是还是不对啊

xiaosi4081 发表于 2020-7-29 15:13:37

bangbang-ande 发表于 2020-7-29 15:11
但是还是不对啊

发错的内容(不要任何改动)

Unicorn# 发表于 2020-7-29 15:37:10

递归函数执行次数太多了,改成递推就好了
另外,头像好评
int climbStairs(int n){
    int a=1, b=1;
    for(int i = 1; i < n; i++)
    {
      b += a;
      a = b - a;
    }
    return b;
}

405794672 发表于 2020-7-29 16:11:51

有大佬告诉我60\%60%是什么意思吗?

bangbang-ande 发表于 2020-7-29 17:41:02

题目网站:https://www.luogu.com.cn/problem/P1255

风过无痕1989 发表于 2020-7-29 20:23:34

Seawolf 发表于 2020-7-29 13:04


请教:你这是 VC++ 程序吗?我用 VC++6.0 没通过。谢谢!

bangbang-ande 发表于 2020-7-29 20:31:33

风过无痕1989 发表于 2020-7-29 20:23
请教:你这是 VC++ 程序吗?我用 VC++6.0 没通过。谢谢!

是c程序

风过无痕1989 发表于 2020-7-29 21:27:32

bangbang-ande 发表于 2020-7-29 20:31
是c程序

不是问你,你的程序当然是C程序啦

Seawolf 发表于 2020-7-29 22:02:37

风过无痕1989 发表于 2020-7-29 20:23
请教:你这是 VC++ 程序吗?我用 VC++6.0 没通过。谢谢!

java

SHRS23 发表于 2020-7-29 22:38:42

动态规划题目
leetcode测试通过
运行时间0 ms
内存消耗        5.2 MB

int climbStairs(int n)
{
    int dp;
    int i;
   
    dp=0;
    dp=1;
    dp=2;
   
    for(i=3;i<=n;i++)
    {
      dp=dp+dp;
    }
    return dp;
}

bangbang-ande 发表于 2020-7-29 23:18:04

SHRS23 发表于 2020-7-29 22:38
动态规划题目
leetcode测试通过
运行时间0 ms


你可不可以试试这个测试网站:
https://www.luogu.com.cn/problem/P1255

Cool_Breeze 发表于 2020-7-30 13:39:17

本帖最后由 Cool_Breeze 于 2020-7-30 13:55 编辑

#include <stdio.h>
#define size_t long long

int main()
{
        size_t n=0;
        scanf("%d",&n);
        register size_t f1=1;
        register size_t f2=1;
        if (n == 1 || n == 2 || n == 3)
        {
                printf("%d", n);
                return 0;
        }
        else
        {
                for(int i = 3;i < n;i++)
                {
                        f1=f1+f2;
                        f2=f2+f1;
                }
        }
        printf("%d", f1 + f2);
        return 0;
}

SHRS23 发表于 2020-7-30 18:04:04

bangbang-ande 发表于 2020-7-29 23:18
你可不可以试试这个测试网站:
https://www.luogu.com.cn/problem/P1255

抱歉我没有洛谷账号{:10_266:}

SHRS23 发表于 2020-7-30 18:26:56

#include<stdio.h>

int climbStairs(int n)
{
    long long dp;
    int i;
   
    dp=0;
    dp=1;
    dp=2;
   
    for(i=3;i<=n;i++)
    {
      dp=dp+dp;
    }
    return dp;
}

int main()
{
    int n = 0;
    scanf("%d",&n);
    printf("%ld", climbStairs(n));
    return 0;
}

注册试了一下发现我竟然三年前注册过。。。
这是WA50的程序,不想改了,洛谷这数据大的离谱,我看题解大家都高精加法做的。。。

Junpei 发表于 2020-8-4 17:24:16

从我的力扣代码改的,这5000这种数据太大了,还得写个字符串表示大整数的加法,用动态规划从底层遍历到顶层结果就出来了
#include<iostream>
#include<vector>
#include<string>

using namespace std;

vector<string> vec(5001, "0");

string addStrings(string num1, string num2) //字符串加法:"1"+"1"="2"
{
        num1 = '0' + num1;
        num2 = '0' + num2;
        int len1 = num1.size();
        int len2 = num2.size();

        string ans = "";
        int cry = 0;
        len1--;
        len2--;
        char ch;
        while (len1 != -1 && len2 != -1)
        {
                ch = num1 + num2 + cry - '0';
                if (ch > '9')
                {
                        ans = (char)(ch - 10) + ans;
                        cry = 1;
                }
                else
                {
                        ans = ch + ans;
                        cry = 0;
                }
                len1--;
                len2--;
        }

        if (len1 == -1)
                while (len2 > -1)
                {
                        ch = num2 + cry;
                        if (ch > '9')
                        {
                                ans = (char)(ch - 10) + ans;
                                cry = 1;
                        }
                        else
                        {
                                ans = ch + ans;
                                cry = 0;
                        }
                        len2--;
                }
        else
                while (len1 > -1)
                {
                        ch = num1 + cry;
                        if (ch > '9')
                        {
                                ans = (char)(ch - 10) + ans;
                                cry = 1;
                        }
                        else
                        {
                                ans = ch + ans;
                                cry = 0;
                        }
                        len1--;
                }

        if (ans == '0')
                ans = ans.substr(1);

        return ans;
}

stringclimbStairs(int n)
{
        vec = "1";
        vec = "2";

        if (n == 1)
                return "1";
        if (n == 2)
                return "2";

        for (int i = 3; i <= n; i++)
                vec = addStrings(vec, vec);

        return vec;
}

int main()
{
    ios::sync_with_stdio(false);
    int num;
    cin >> num;
    string ans = climbStairs(num);
    cout << ans;

    return 0;
}
页: [1]
查看完整版本: 爬楼梯