1. 程式人生 > >HDU_oj_2045 不容易系列之RPG問題

HDU_oj_2045 不容易系列之RPG問題

www. href ace lan 研究 () pro -a spa

Problem Description

有排成一行的n個方格,用紅(Red)、粉(Pink)、綠(Green)三色塗每個格子,每格塗一色,

要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的塗法.

以上就是著名的RPG難題.

Input

輸入數據包含多個測試實例,每個測試實例占一行,由一個整數N組成,(0<n<=50)。

Output

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

Sample Input

1 2

Sample Output

3

6

分析:

又是典型的遞歸問題:

最後一個格子的塗色除了不能和第一個格子一樣,它還受到第n-1個格子的制約,

有以下兩種情況:

①第n-1個格子和第一個格子顏色一樣,則最後一個格子有兩種選擇,

而第n-2個格子由於不會和第n-1個格子顏色一樣,所以這種情況下,總共有2*F(n-2)種情況

②第n-1個格子和第一個格子顏色不一樣,則最後一個格子只能有一種選擇,

而第n-1個格子的顏色滿足要求,所以這種情況下,總共有F(n-1)種情況

所以綜上所述,總的塗法為:F(n)=F(n-1)+2*F(n-2)  (n>=4)

遞歸問題可查看鏈接:http://www.cnblogs.com/tenjl-exv/p/8016577.html

註意點:

後面數據可能有點大,最好用64bit存儲

 1 //遞歸解法,但不是遞歸寫法
2 //遞歸寫起來可能會超時 3 #include<iostream> 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 long long fx,fy,fz; 10 while(cin>>n) 11 { 12 fx=6;fy=6;fz=0; 13 if(n==1) 14 cout<<"3"<<endl; 15 else if(n==2) 16 cout<<fx<<endl;
17 else if(n==3) 18 cout<<fy<<endl; 19 else 20 { 21 n-=3; 22 while(n--) 23 { 24 fz=fy+2*fx; 25 fx=fy; 26 fy=fz; 27 } 28 cout<<fz<<endl; 29 } 30 } 31 }

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

HDU_oj_2045 不容易系列之RPG問題