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.youkuaiyun.com/xnmc2014/article/details/89220897