D - 不容易系列之(3)―― LELE的RPG難題
人稱“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個格子的塗法爲a[n]
(1)如果第n-1個格子與第一個格子顏色不同,那麼第n個格子只有一種塗法,也就是說塗不塗第n個對結果沒有影響,即a[n]=a[n-1];
(2)如果第n-1個格子與第一個格子顏色相同,那麼第n個格子就有兩種塗法,且種類與第n-2個格子相同,即a[n]=a[n-2]*2;
綜上:a[n]=a[n-1]+a[n-2]+2;
#include <stdio.h>
#include <stdlib.h>
int main()
{
long long color[51]={0,3,6,6};
int i;
for(i = 4;i < 51;i++)
{
color[i] = color[i-1] + color[i-2]*2;
}
while(scanf("%d",&i)!=EOF)
{
printf("%I64d\n",color[i]);
}
return 0;
}