魔法深渊 - Java

https://www.nowcoder.com/question/next?pid=13546819&qid=278435&tid=25897367

前几个月放映的头号玩家简直火得不能再火了,作为一个探索终极AI的研究人员,月神自然去看了此神剧。
由于太过兴奋,晚上月神做了一个奇怪的梦,月神梦见自己掉入了一个被施放了魔法的深渊,月神想要爬上此深渊。

已知深渊有N层台阶构成(1 <= N <= 1000),并且每次月神仅可往上爬2的整数次幂个台阶(1、2、4、…),请你编程告诉月神,月神有多少种方法爬出深渊.

输入描述:
输入共有M行,(1<=M<=1000)
第一行输入一个数M表示有多少组测试数据,
接着有M行,每一行都输入一个N表示深渊的台阶数

输出描述:
输出可能的爬出深渊的方式

输入例子1:
4
1
2
3
4

输出例子1:
1
2
3
6

思路
参考:https://www.nowcoder.com/test/question/done?tid=25888982&qid=278441#summary
网上都是C版的,这里写一个Java版的……也就是C版同一个思路用Java来实现。

台阶问题考虑动态规划
每次仅可往上爬 2 的整数次幂个台阶(1、2、4、…)
当前台阶方法数 = 所有一次可到达当前台阶方法数的和
即 , dp[n] = dp[n-1]+dp[n-2]+dp[n-4]+... ( n-t>=0,dp[0]=1 )

比如
dp[0] = 1
dp[1] = dp[0] = 1
dp[2] = dp[1] + dp[0] = 2
dp[3] = dp[2] + dp[1] = 3
dp[4] = dp[3] + dp[2] + dp[0] = 6
.
.
.
dp[n] = dp[n-1] + dp[n-2] + dp[n-4] + . . . + dp[n-t]
(t 是 2的整数次幂,t = 1、2、4、…)

%1000000003 避免整数溢出问题,10^9 +3

代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
    		Scanner sc = new Scanner(System.in);
		int m = sc.nextInt();
        int mod = 1000000003;
		// 台阶数
		int[] arr = new int[1001];
		arr[0] = 1;
		for(int i=1;i<arr.length;i++){
			int t = 1;
			while(t <= i){
				arr[i] += arr[i-t];
                arr[i] %= mod;
				t *= 2;
			}
		}
		for(int i=0;i<m;i++){
			System.out.println(arr[sc.nextInt()]);
		}    
    }    
}

Ref
其他类似题目: https://blog.csdn.net/xnmc2014/article/details/89220897

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值