1. 程式人生 > >hdoj2045:LELE的RPG難題(遞推)

hdoj2045:LELE的RPG難題(遞推)

不容易系列之(3)—— LELE的RPG難題

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 65151    Accepted Submission(s): 25995  

Problem Description

人稱“AC女之殺手”的超級偶像LELE最近忽然玩起了深沉,這可急壞了眾多“Cole”(LELE的粉絲,即"可樂"),經過多方打探,某資深Cole終於知道了原因,原來,LELE最近研究起了著名的RPG難題: 有排成一行的n個方格,用紅(Red)、粉(Pink)、綠(Green)三色塗每個格子,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的塗法. 以上就是著名的RPG難題. 如果你是Cole,我想你一定會想盡辦法幫助LELE解決這個問題的;如果不是,看在眾多漂亮的痛不欲生的Cole女的面子上,你也不會袖手旁觀吧?

Input

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

Output

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

Sample Input

1 2

Sample Output

3 6

解題思路:

 1、如果前n-1個格子已經塗好了的話,方法數為f(n-1),且第n-1個格子的顏色一定和第一個格子的顏色不同,那麼第n個格子只有一種顏色可以塗

2、如果前n-2個格子已經塗好了的話,方法數為f(n-2),且第n-2個格子的顏色一定和第一個格子的顏色不同,若第n-1個顏色的格子與第一個顏色不同,則與“1、”中的情況重複,所以第n-1個格子的顏色一定與第一個格子的顏色相同,那麼第n個格子的顏色就有兩個選擇,方法數為2*f(n-2)

所以f(n)=f(n-1)+2*f(n-2)   (n>=4)

ac程式碼:

注意:要用long long

#include <iostream>
using namespace std;
int main()
{
    long long  i,a[55];
    a[1]=3;
    a[2]=6;
    a[3]=6;
    for(i=4;i<=55;i++)
        a[i]=a[i-1]+a[i-2]*2;
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        cout<<a[n]<<endl;
    }
    return 0;
}