题目描述
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例
输入
4
输出
5
说明/提示
对于 60%的数据,N≤50;
对于 100% 的数据,1≤N≤5000。
解题思路
1.动态规划!!
- 三步骤:
定义数组dp[]:第n个数则为方法楼梯数
初始化dp[0]=;dp[1]=1;dp[2]=2;
关系式dp[i]=dp[i-1]+dp[i-2];(因为第i格只有由下一格或下两格跳上来的)
- 算法实现
- 注意数据N最大为5000,所以累加得采用高精度(java自带BigInterger)
【超时】采用原始方式,定义数组dp[N+1]
BigInteger dp[]=new BigInteger[n+1];
dp[0]=BigInteger.valueOf(0);dp[1]=BigInteger.valueOf(1);dp[2]=BigInteger.valueOf(2);
for (int i = 3; i <= n; i++) {
dp[i]=dp[i-1].add(dp[i-2]);
}
printWriter.println(dp[n]);
printWriter.flush();
- 【正确】可能数组过大导致,抛弃数组,毕竟我们只要输出最后循环计算得到的数,即只采用三个高精度的数轮番计算赋值即可
BigInteger dp1=BigInteger.valueOf(1),dp2=BigInteger.valueOf(2),dp3 = BigInteger.valueOf(2);
for (int i = 3; i <= n; i++) {
dp3=dp2.add(dp1);
dp1=dp2;
dp2=dp3;
}
代码
public class Main{
public static void main(String[] args) throws IOException {
StreamTokenizer streamTokenizer = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(System.out));
int n;
streamTokenizer.nextToken();
n=(int)streamTokenizer.nval;
if (n==0) {
printWriter.println(0);
printWriter.flush();
return;
}else if (n==1){
printWriter.println(1);
printWriter.flush();
return;
}
BigInteger dp1=BigInteger.valueOf(1),dp2=BigInteger.valueOf(2),dp3 = BigInteger.valueOf(2);
for (int i = 3; i <= n; i++) {
dp3=dp2.add(dp1);
dp1=dp2;
dp2=dp3;
}
printWriter.println(dp3);
printWriter.flush();
}
}