(字节面试题)青蛙跳台变形(一次 k 阶台阶)

编程入门 行业动态 更新时间:2024-10-04 19:27:30

(字节面试题)青蛙<a href=https://www.elefans.com/category/jswz/34/1768659.html style=跳台变形(一次 k 阶台阶)"/>

(字节面试题)青蛙跳台变形(一次 k 阶台阶)

你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式,一个学姐在字节面试面到的题目,一次 可以 迈 k 阶台阶,普通的青蛙跳台是迈 1 或者 2,现在是 1 - k 都有可能,所以,依旧使用数组进行求解:范围在 i - k 之间的数都加上,动态转移方程:

dp[n] = dp[n - 1] + dp[n - 2] + ..... + dp[n - k]

解:

import java.util.*;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();int[] dp = new int[n + 1];dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= k && i - j >= 0; j++) {dp[i] += dp[i - j];}}System.out.println(dp[n]);}
}

发现上面的代码是可以优化的,因为求 i - k 范围内的和,完全可以使用找规律代码:
当 n 小于 k 的时候,

dp[n] = dp[n - 1] + dp[n - 2].....+ dp[0]
dp[n -1] = dp[n - 2] + ..... + dp[0];
所以 dp[n] = 2 fp[n - 1];

当 n 大于 k 的时候,

f[n] = f[n-1] + f[n-2] + f[n-3] + ... + f[n-m]f[n-1] = f[n-2] + f[n-3] + ... + f[n-1-m]f[n] = 2*f[n-1] - f[n-1-m]

所以直接循环体:

package company;
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();int[] dp = new int[n + 1];int[] sum = new int[n + 1];dp[0] = 1;for (int i = 1; i <= n; i++) {if (i <= k) {dp[i] = (int) Math.pow(2.0, i - 1.0);} else {dp[i] = 2 * dp[i - 1] - dp[i - 1 - k];}}System.out.println(dp[n]);}
}

更多推荐

(字节面试题)青蛙跳台变形(一次 k 阶台阶)

本文发布于:2024-02-19 19:47:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765676.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:跳台   字节   台阶   青蛙   面试题

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!