鱼C论坛

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

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

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

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

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

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

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

C++
  1. #include <iostream>
  2. #include <map>

  3. using std::map;
  4. int foo(int n, int k, map <int, int> MAP) {
  5.         int count = 0;
  6.         if (not(n)) return 1;
  7.         if (MAP.count(n)) return MAP[n];
  8.         else if (n >= k) {
  9.                 for (int i = 1; i <= k; ++i) count += foo(n - i, k, MAP);
  10.         }
  11.         else count += foo(n, n, MAP);
  12.         MAP[n] = count;
  13.         return count;
  14. }

  15. using std::cout, std::endl;
  16. int main(void) {
  17.         map <int, int> MAP;
  18.         int n = 10, k = 4;
  19.         cout << foo(n, k, MAP) << endl;
  20.         return 0;
  21. }
复制代码
Java
  1. import java.util.*;

  2. public class Main
  3. {
  4.         public static int foo(int n, int k, Map <Integer, Integer> map) {
  5.             int count = 0;
  6.             if (n == 0) return 1;
  7.             if (map.containsKey(n)) return map.get(n);
  8.             else if (n >= k) {
  9.                 for (int i = 1; i <= k; ++i) count += foo(n - i, k, map);
  10.             }
  11.             else count += foo(n, n, map);
  12.             map.put(n, count);
  13.             return count;
  14.         }
  15.        
  16.         public static void main(String[] args) {
  17.             Map <Integer, Integer> map = new HashMap <Integer, Integer>();
  18.             int n = 10, k = 4;
  19.                 System.out.println(foo(n, k, map));
  20.         }
  21. }
复制代码
Python
  1. def foo(n, k, MAP = dict()):
  2.     count = 0
  3.     if not n: return 1
  4.     if n in MAP.keys(): return MAP[n]
  5.     elif n >= k:
  6.         for i in range(1, k + 1):
  7.             count += foo(n - i, k, MAP)
  8.     else: count += foo(n, n, MAP)
  9.     MAP[n] = count
  10.     return count

  11. n, k = 10, 4
  12. 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 编辑

这是我的答案:

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

  2. using namespace std;

  3. int n, k;

  4. int get(int x) {
  5.         if (x < 0)
  6.                 return 0;
  7.         return x;
  8. }

  9. long long solve(int n) {
  10.         long long dp[1000] = {1, 1};
  11.         for (int i = 2; i <= n; ++i)
  12.                 for (int j = 1; j <= k; ++j)
  13.                         dp[i] += dp[get(i - j)];
  14.         return dp[n];
  15. }
  16. int main() {
  17.         scanf("%d%d", &n, &k);
  18.         printf("%lld", solve(n));
  19.         return 0;
  20. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
  1. #include<bits/stdc++.h>

  2. using namespace std;
  3. typedef long long LL;
  4. const int maxn = 100000 + 10;

  5. int dp[maxn];
  6. void solve()
  7. {
  8.         int n,k;
  9.         scanf("%d%d",&n,&k);
  10.         for(int i =1;i<=k;i++) dp[i] = 1;
  11.         for(int i = 2;i<=n;i++)
  12.         {
  13.                 for(int j = 1;j<=k&&j<=i;j++)
  14.                 {
  15.                         dp[i] = (dp[i]+dp[i-j])%100003;
  16.                 }
  17.         }
  18.         printf("%d\n",dp);
  19. }

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

使用道具 举报

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

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

C++
  1. #include <iostream>
  2. #include <map>

  3. using std::map;
  4. int foo(int n, int k, map <int, int> MAP) {
  5.         int count = 0;
  6.         if (not(n)) return 1;
  7.         if (MAP.count(n)) return MAP[n];
  8.         else if (n >= k) {
  9.                 for (int i = 1; i <= k; ++i) count += foo(n - i, k, MAP);
  10.         }
  11.         else count += foo(n, n, MAP);
  12.         MAP[n] = count;
  13.         return count;
  14. }

  15. using std::cout, std::endl;
  16. int main(void) {
  17.         map <int, int> MAP;
  18.         int n = 10, k = 4;
  19.         cout << foo(n, k, MAP) << endl;
  20.         return 0;
  21. }
复制代码
Java
  1. import java.util.*;

  2. public class Main
  3. {
  4.         public static int foo(int n, int k, Map <Integer, Integer> map) {
  5.             int count = 0;
  6.             if (n == 0) return 1;
  7.             if (map.containsKey(n)) return map.get(n);
  8.             else if (n >= k) {
  9.                 for (int i = 1; i <= k; ++i) count += foo(n - i, k, map);
  10.             }
  11.             else count += foo(n, n, map);
  12.             map.put(n, count);
  13.             return count;
  14.         }
  15.        
  16.         public static void main(String[] args) {
  17.             Map <Integer, Integer> map = new HashMap <Integer, Integer>();
  18.             int n = 10, k = 4;
  19.                 System.out.println(foo(n, k, map));
  20.         }
  21. }
复制代码
Python
  1. def foo(n, k, MAP = dict()):
  2.     count = 0
  3.     if not n: return 1
  4.     if n in MAP.keys(): return MAP[n]
  5.     elif n >= k:
  6.         for i in range(1, k + 1):
  7.             count += foo(n - i, k, MAP)
  8.     else: count += foo(n, n, MAP)
  9.     MAP[n] = count
  10.     return count

  11. n, k = 10, 4
  12. 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-5-20 18:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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