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; }