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

HDU 2045 LELE的RPG難題(遞推)

%d out miss rpg 方式 最終 desc ont !=

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

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

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.也是一道遞推找規律的題,首先易知f(1)=3;f(2)=6;f(3)=6;f(4)=18;

現在考慮n>3的情況,若第n-1個格子和第一個格子不同,則為f(n-1);

若第n-1個格子和第1個格子相同,則第n-2個格子和第一個格子必然不同,此時為f(n-2)再乘第n-1個格子的顏色數,很顯然第n-1個格子可以是第一個格子(即第n-2個格子)的顏色外的另外兩種,這樣為2*f(n-2);

因此總的情況為f(n)=f(n-1)+2*f(n-2);

2.如果不考慮首尾顏色不同的話,那每次 a[i]=a[i-1]*2; 但是要考慮首尾不同,設a[i]是不考慮首尾不同的數組,那麽考慮首尾不同的下標為i的數值為 a[i-1]中的首尾相同的部分*2 + a[i-1]中首尾不同部分*1
首尾不同的和首尾相同的之和等於a[i]且a[i-1]中首尾相同的部分等與a[i-2]中首尾首尾不同的部分。 3.考慮長為n的串。若前n-1位組成的串合法,則由於首尾不同,再添加一位時,只有1種顏色可選;若前n-1位組成的串不合法(首尾相同),那麽前n-2位組成的串必須合法(因為最終要組成的n位是合法的)。此時第n位有2種顏色可選。故f(n)=f(n-1)+2*f(n-2)。 邊界條件:f(1)=3,f(2)=f(3)=6。

PS:可用特征方程得出n>3時f(n)的封閉形式f(n)=2^n+2*(-1)^n。

4.a[i]=分兩種,
1) 前i-1首尾不同 ,個數剛好a[i-1]。
2) 前i-1首尾相同 ,顯然第一個與第i-2個顏色就不能相同了,個數剛好a[i-2], 但是此時最後一個可以取兩種顏色。

5.分析到n的合法塗法總數:
1)n-1與1的顏色一樣, 既然n-1與1同色,說明n-2一定不與1同色,那麽,則對於第n個格子有兩種塗色方法
即:2*f[n-2];
2)n-1與1的顏色不一樣,那麽,第n個格子的塗色方式只有一種
即:f[n-1]
3)f[n]=f[n-1]+2*f[n-2];

#include <stdio.h>
int main()
{
	int i,n;
	__int64 a[51]={3,6,6};
	for (i=3;i<51;i++)
		a[i]=a[i-1]+a[i-2]*2;
	while (scanf("%d",&n)!=EOF)
		printf("%I64d\n",a[n-1]);
	return 0;
}

  

HDU 2045 LELE的RPG難題(遞推)