【洛谷】P1255 数楼梯(Java,DP动态规划,递推,BigInteger)

P1255 数楼梯

题目描述

楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

输入输出样例

输入 #1

4

输出 #1

5

说明/提示

对于 60% 的数据,50N≤50;
对于 100% 的数据,1≤N≤5000。

这题一般使用DP动态规划+递推来解决
定义一个[n+1]长度的数组来存放 方法数
a[n]表示第n级台阶总共几种走法

以下是洛谷有WA50分的代码

import java.util.Scanner;
public class P1255_CountStairs {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();//楼梯数
		System.out.println(CS(N));
	}
	
	public static int CS(int n) {//Count Stairs
		if (n==0) {
			return 0;
		}else if (n==1) {
			return 1;
		}else if (n==2) {
			return 2;
		}
		int a[] = new int[n+1];
		//三个初始值,不止a[0]、a[1],a[2]可以一步走上,也可以通过a[1]两步走上,所以方法为2,也算初始值
		a[0] = 0;
		a[1] = 1;
		a[2] = 2;
		for (int i = 3; i <= n; i++) {
			a[i] = a[i-1]+a[i-2];
		}
		return a[n];
	}

}

上面这个代码会出现WA,当代入测试4时会输出5,这是因为n够小,答案数值也就够小,所以能正确输出。当输入n值为100时,输出为-1869596475,而题目N最大为5000,所以int型和long型肯定不能全部通过。在java中当数值过大的时候,可以使用BigInteger类型来存储答案。

以下是洛谷AC的代码

import java.math.BigInteger;
import java.util.Scanner;
//DP、递推、BigInteger(当N大于几百后会非常大,等于5000时,java的int、long并不能存下结果,所以得使用BigInteger)
public class P1255_CountStairs {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();//楼梯数
		System.out.println(CS(N));
	}
	
	public static BigInteger CS(int n) {
		if (n==0) {
			return BigInteger.ZERO;
		}else if (n==1) {
			return BigInteger.ONE;
		}else if (n==2) {
			return new BigInteger("2");
		}
		BigInteger a[] = new BigInteger[n+1];
		a[0] = new BigInteger("0");
		a[1] = new BigInteger("1");
		a[2] = new BigInteger("2");
		for (int i = 3; i <= n; i++) {
			a[i] = a[i-1].add(a[i-2]) ;
		}
		return a[n];
	}

}

输入:
5000
输出:
6276302800488957086035253108349684055478528702736457439025824448927937256811663264475883711527806250329984690249846819800648580083040107584710332687596562185073640422286799239932615797105974710857095487342820351307477141875012176874307156016229965832589137779724973854362777629878229505500260477136108363709090010421536915488632339240756987974122598603591920306874926755600361865354330444681915154695741851960071089944015319300128574107662757054790648152751366475529121877212785489665101733755898580317984402963873738187000120737824193162011399200547424034440836239726275765901190914513013217132050988064832024783370583789324109052449717186857327239783000020791777804503930439875068662687670678802914269784817022567088069496231111407908953313902398529655056082228598715882365779469902465675715699187225655878240668599547496218159297881601061923195562143932693324644219266564617042934227893371179832389642895285401263875342640468017378925921483580111278055044254198382265567395946431803304304326865077742925818757370691726168228648841319231470626

(第一次输出出来真的吓一跳。。。)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值