鱼C论坛

 找回密码
 立即注册
查看: 2521|回复: 7

[已解决]经典问题之爬楼梯(c)

[复制链接]
发表于 2022-9-24 10:57:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
台阶数仍为n,每次你可以向上走至少1个至多 K 个台阶,有多少种不同走法?
最佳答案
2022-9-25 10:33:23
本帖最后由 傻眼貓咪 于 2022-9-25 10:35 编辑

纯粹想练习练习,太久没有写代码了,生疏
我的思路:动态规划

C++
#include <iostream>
#include <map>

using std::map;
int foo(int n, int k, map <int, int> MAP) {
        int count = 0;
        if (not(n)) return 1;
        if (MAP.count(n)) return MAP[n];
        else if (n >= k) {
                for (int i = 1; i <= k; ++i) count += foo(n - i, k, MAP);
        }
        else count += foo(n, n, MAP);
        MAP[n] = count;
        return count;
}

using std::cout, std::endl;
int main(void) {
        map <int, int> MAP;
        int n = 10, k = 4;
        cout << foo(n, k, MAP) << endl;
        return 0;
}
Java
import java.util.*;

public class Main
{
        public static int foo(int n, int k, Map <Integer, Integer> map) {
            int count = 0;
            if (n == 0) return 1;
            if (map.containsKey(n)) return map.get(n);
            else if (n >= k) {
                for (int i = 1; i <= k; ++i) count += foo(n - i, k, map);
            }
            else count += foo(n, n, map);
            map.put(n, count);
            return count;
        }
        
        public static void main(String[] args) {
            Map <Integer, Integer> map = new HashMap <Integer, Integer>();
            int n = 10, k = 4;
                System.out.println(foo(n, k, map));
        }
}
Python
def foo(n, k, MAP = dict()):
    count = 0
    if not n: return 1
    if n in MAP.keys(): return MAP[n]
    elif n >= k:
        for i in range(1, k + 1):
            count += foo(n - i, k, MAP)
    else: count += foo(n, n, MAP)
    MAP[n] = count
    return count

n, k = 10, 4
print(foo(n, k))


C 懒的写,就不写了 ,至於 C++ 速度极慢,参数如果太大需要时间运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-24 11:32:39 | 显示全部楼层
像动态规划
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 12:25:01 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-9-24 12:28 编辑

这是我的答案:

递推法,有点像斐波那契数列:
#include <cstdio> 

using namespace std;

int n, k;

int get(int x) {
        if (x < 0)
                return 0;
        return x;
}

long long solve(int n) {
        long long dp[1000] = {1, 1};
        for (int i = 2; i <= n; ++i)
                for (int j = 1; j <= k; ++j)
                        dp[i] += dp[get(i - j)];
        return dp[n];
}
int main() {
        scanf("%d%d", &n, &k); 
        printf("%lld", solve(n));
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-9-24 12:30:44 | 显示全部楼层
设 f[i] 代表走到第 n 阶一共的走法数 , 显然 f[n] 就是答案
要到 f[i] , 必定是从前面 1 阶 , 前 2 阶... 前 n 阶走过来的
所以 f[i] = f[i-1] + f[i-2] + ... f[i-n]
这样一直递推就可以了  注意 f[1] = 1 的边界条件
数组要特判下标 , 不能越界
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-24 13:56:37 | 显示全部楼层
#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
const int maxn = 100000 + 10;

int dp[maxn];
void solve()
{
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i =1;i<=k;i++) dp[i] = 1;
        for(int i = 2;i<=n;i++)
        {
                for(int j = 1;j<=k&&j<=i;j++)
                {
                        dp[i] = (dp[i]+dp[i-j])%100003;
                }
        }
        printf("%d\n",dp);
}

int main()
{
        solve();
        return 0;
}
回答不易,望设最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-25 10:33:23 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2022-9-25 10:35 编辑

纯粹想练习练习,太久没有写代码了,生疏
我的思路:动态规划

C++
#include <iostream>
#include <map>

using std::map;
int foo(int n, int k, map <int, int> MAP) {
        int count = 0;
        if (not(n)) return 1;
        if (MAP.count(n)) return MAP[n];
        else if (n >= k) {
                for (int i = 1; i <= k; ++i) count += foo(n - i, k, MAP);
        }
        else count += foo(n, n, MAP);
        MAP[n] = count;
        return count;
}

using std::cout, std::endl;
int main(void) {
        map <int, int> MAP;
        int n = 10, k = 4;
        cout << foo(n, k, MAP) << endl;
        return 0;
}
Java
import java.util.*;

public class Main
{
        public static int foo(int n, int k, Map <Integer, Integer> map) {
            int count = 0;
            if (n == 0) return 1;
            if (map.containsKey(n)) return map.get(n);
            else if (n >= k) {
                for (int i = 1; i <= k; ++i) count += foo(n - i, k, map);
            }
            else count += foo(n, n, map);
            map.put(n, count);
            return count;
        }
        
        public static void main(String[] args) {
            Map <Integer, Integer> map = new HashMap <Integer, Integer>();
            int n = 10, k = 4;
                System.out.println(foo(n, k, map));
        }
}
Python
def foo(n, k, MAP = dict()):
    count = 0
    if not n: return 1
    if n in MAP.keys(): return MAP[n]
    elif n >= k:
        for i in range(1, k + 1):
            count += foo(n - i, k, MAP)
    else: count += foo(n, n, MAP)
    MAP[n] = count
    return count

n, k = 10, 4
print(foo(n, k))


C 懒的写,就不写了 ,至於 C++ 速度极慢,参数如果太大需要时间运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-28 15:57:07 | 显示全部楼层
高山 发表于 2022-9-24 13:56
回答不易,望设最佳

您好,我是小白,请问输出dp是什么意思?dp不是一个数组吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 18:21:09 | 显示全部楼层
我的代码没有通过吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 11:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表