發篇塵封在電腦裏的我的小筆記
不容易系列之(3)—— LELE的RPG難題
Time Limit:2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K(Java/Others)
TotalSubmission(s): 58515 Accepted Submission(s): 23449
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
首先想了很久,然後被自己蠢到了。
假設有n個格子。
這個問題先要將n=1,n=2,n=3三種情況推一遍。然後考慮n=4時的情況。我們知道n=3時,由於最後一個格子不能與第一個相同,所以n=4如果用的是n=3的結果只有一種顏色可以填進去。
也就是f(n-1)個方法。
由於我們現在做的是n=4的情況,所以我們可以在第三個格子填入與第一個格子相同的顏色,我們也就可以在最後一個填入另外兩個隨意的顏色。
也就是2*f(n-2)個方法。
遞歸函數: f(n) = f(n-1) + 2*f(n-2)
下面呈上小弟AC的代碼:
#include<iostream>
#include<cstdio>
using namespacestd;
long long arr[100];
int main()
{
arr[1] = 3;
arr[2] = 6;
arr[3] = 6;
for(int i = 4; i < 100; i++)
arr[i] = arr[i-1] + 2*arr[i-2];
int n;
while(scanf("%d", &n) != EOF)
printf("%lld\n", arr[n]);
return 0;
}