HDU 2045 不容易系列之(3)―― LELE的RPG难题(递推 or 动态规划)

Description

人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题: 

有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法. 

以上就是著名的RPG难题. 

如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧? 

 

Input

输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0
 

Output

对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。 
 

Sample Input

 
     
1 2
 

Sample Output

 
     
3 6

                                   

方法1:

a [ i ] 为第 i 个格子与第 1 个格子颜色相同的数量  

b [ i ] 为第 i 个格子与第 1 个格子颜色不同的数量   


a [ i ] 的计算:

对于每第 i 个格子 ,a [ i ]  等于 第 i - 1 个格子中与第 1 个格子颜色不同的数量 ,

即  a [ i ] = b [ i - 1]


b [ i ] 的计算:

对于每第 i 个格子 ,b [ i ]  等于 第 i - 1 个格子中与第 1 个格子颜色不同的数量的两倍   +   第 i - 1 个格子中与第 1 个格子颜色相同的数量

即  b [ i ] = a [ i - 1] * 2 + b [ i - 1] 


#include 
#define  N 60
long long a[N], b[N];

int main() {
	int n;
	while (scanf("%d", &n) == 1) {
		a[1] = 1; b[1] = 0;
		for (int i = 2; i <= n; i++) {
			a[i] = b[i - 1];
			b[i] = a[i - 1] * 2 + b[i - 1]; 
		}
		if (n == 1)
			printf("3\n");
		else
			printf("%lld\n", b[n] * 3);
	}
	return 0;
}

方法2:

要凃 n 个格子,

那么 ,第 n - 1 个格子的颜色可能和 第 1 个格子的颜色相同(第 ① 种情况),也可能和 第 1 个格子的颜色不相同(第 ② 种情况),凃 n 个格子的凃法 a [ n ] 等于 这两种情况的凃法之和


在第 ① 种情况下,凃第 n 个格子时有剩下和他们两个格子(第 1 个 和 第 i 个)颜色不同的两个颜色可以涂, 所以在此情况下的凃法为 a [ i - 1] 种

在第 ① 种情况下,凃第 n 个格子时是有剩下的一种颜色可以涂, 所以在此情况下的凃法为 a [ i - 2]  * 2 种


#include 
#define N 60
long long a[N];

int main() {
	int n;
	while (scanf("%d", &n) == 1) {
		a[0] = 0;
		a[1] = 3;
		a[2] = 6;
		a[3] = 6;
		for (int i = 4; i <= n; i++)
			a[i] = a[i - 1] + a[i - 2] * 2;
		printf("%lld\n", a[n]);
	}
	return 0;
}

方法二的另一种想法(转):http://blog.csdn.net/lostaway/article/details/5744821

你可能感兴趣的:(HDU)