1. 程式人生 > >【遞推】ZSC1074: 數學、阿牛的EOF牛肉串

【遞推】ZSC1074: 數學、阿牛的EOF牛肉串

Description
今年的ACM暑期集訓隊一共有18人,分為6支隊伍。其中有一個叫做EOF的隊伍,由04級的阿牛、XC以及05級的COY組成。在共同的集訓生活中,大家建立了深厚的友誼,阿牛準備做點什麼來紀念這段激情燃燒的歲月,想了一想,阿牛從家裡拿來了一塊上等的牛肉乾,準備在上面刻下一個長度為n的只由"E" "O" "F"三種字元組成的字串(可以只有其中一種或兩種字元,但絕對不能有其他字元),阿牛同時禁止在串中出現O相鄰的情況,他認為,"OO"看起來就像發怒的眼睛,效果不好。 你,NEW ACMer,EOF的崇拜者,能幫阿牛算一下一共有多少種滿足要求的不同的字串嗎? PS: 阿牛還有一個小祕密,就是準備把這個刻有 EOF的牛肉乾,作為神祕禮物獻給校慶,可以想象,當校長接過這塊牛肉乾的時候該有多高興!這裡,請允許我代表杭電的ACMer向阿牛表示感謝! 再次感謝!

Input
輸入資料包含多個測試例項,每個測試例項佔一行,由一個整數n組成,( 0 < n < 40 )。

Output
對於每個測試例項,請輸出全部的滿足要求的塗法,每個例項的輸出佔一行。

Sample Input
1
2
Sample Output
3
8

import java.util.Scanner;
public class Main {
    public static void main(String []args){
        Scanner zyx=new Scanner(System.in);
        while(true){
            int n=zyx.nextInt();
            long arr[]=new long[42];
            arr[1]=3;
            arr[2]=8;
            for(int i=3;i<=39;i++){
                arr[i]=2*(arr[i-1]+arr[i-2]);
            }
            System.out.println(arr[n]);
        }
    }
}

新新增的那個空有三種情況:E、O、F。如果沒有任何限制的話,則直接F(n)=F(n-1)×3,然而需要考慮"OO"的情況,所以無法直接"×3"來解決問題。
可以分類討論,如果新新增的那個空是E或者F,則沒有限制,此時總的種數為F(n-1)×2
如果新新增的那個空是O,則要求第n-2個空不能是O,所以我們可以先確定F(n-2)的情況數,再固定最後一個空是"O",最後再討論第n-2個空是什麼,第n-2個空只能是E或者F,所以總的情況數為F(n-2)×2
故,由遞推關係可得F(n)=F(n-1)×2+F(n-2)×2=2×[F(n-1)+F(n-2)]

另外此題需要考慮所求結果可能超出int接收範圍,故命名陣列時需要用上long型別。