1. 程式人生 > >演算法題練習系列之(三十七): 客似雲來

演算法題練習系列之(三十七): 客似雲來

-----------------------------------------------------------------------------------------------------------

時間限制:1秒  空間限制:32768K  程式碼長度限制 100 KB

-----------------------------------------------------------------------------------------------------------
題目描述:
NowCoder開了一家早餐店,這家店的客人都有個奇怪的癖好:他們只要來這家店吃過一次早餐,就會每天都過來;並且,所有人在這家店吃了兩天早餐後,接下來每天都會帶一位新朋友一起來品嚐。
於是,這家店的客人從最初一個人發展成浩浩蕩蕩成百上千人:1、1、2、3、5……
現在,NowCoder想請你幫忙統計一下,某一段時間範圍那他總共賣出多少份早餐(假設每位客人只吃一份早餐)。。
輸入描述:
測試資料包括多組。
每組資料包含兩個整數from和to(1≤from≤to≤80),分別代表開店的第from天和第to天。
輸出描述:
對應每一組輸入,輸出從from到to這些天裡(包含from和to兩天),需要做多少份早餐。
輸入例子:
1 10
2 8
36 80
輸出例子:
143
53
61305790697453774

-----------------------------------------------------------------------------------------------------------

實現思路:

(1).典型的斐波那契數列,寫出遞迴求第N項的值;

(2).迴圈從form到to,逐一加和即可;

(3).需要注意的是,該題不能直接遞迴呼叫求結果,會超時,有兩個方法處理,第一種是,先把結果算出來用陣列儲存,然後根據對應的N值,直接獲取對應的兔子數;一種是用map記錄哪些N是計算過的,直接儲存下來,不反覆去計算。

-----------------------------------------------------------------------------------------------------------


package com.biyao.algorithm.niuke.a2;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main_a2_004 {
	
	public static Map<Integer,Long> map = new HashMap<Integer,Long>();
	public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()){
        	int from = scan.nextInt();
        	int to = scan.nextInt();
        	long count = 0;
        	for (int i = from; i <= to; i++) {
        		count = count + getRabbitNum(i);
			}
        	System.out.println(count);
        }
    
	}
	
	public static long getRabbitNum(int n){
		if(n == 1){
			return 1;
		}else if(n == 2){
			return 1;
		}else{
			if(map.containsKey(n)){
				return map.get(n);
			}else{
				map.put(n, getRabbitNum(n-1) + getRabbitNum(n-2));
			}
			return map.get(n);
		}
	}

}