台阶问题(洛谷P1192题题解,Java语言描述)

题目要求

题目链接

在这里插入图片描述

分析

记得讲过的跳台阶问题吗?那个题限制一个或两个台阶,故可以使用递推式f[i]=f[i1]+f[i2]f[i]=f[i−1]+f[i−2]求解,那这个题1K1 \sim K个台阶其实也是类似的。

到达某一个台阶的所有可能是到达其下1K1 \sim K个台阶的所有可能总和,所以递推式是:

f[i]={j=1if[ij],i<kj=1kf[ij],i≥kf[i]= \begin{cases} \sum\limits_{j=1}^{i}f[i-j], & \text{i<k}\\ \\ \sum\limits_{j=1}^{k}f[i-j], & \text{i≥k} \end{cases}

也就是:f[i]=j=1min{i,k}f[ij]f[i] = \sum\limits_{j=1}^{min\{i, k\}}f[i-j]

注意:对100003取模。

AC代码(Java语言描述)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(), k = scanner.nextInt();
        scanner.close();
        int[] nums = new int[n+1];
        nums[0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= k && i-j >= 0; j++) {
                nums[i] += nums[i-j];
                nums[i] %= 100003;
            }
        }
        System.out.println(nums[n]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章