杭电2045---不容易系列之(3)—— LELE的RPG难题

题目:不容易系列之(3)—— LELE的RPG难题


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

解决方法:

先用列举法,我们可以得到f(1)=3,f(2)=6,f(3)=6,f(4)=18
f(4)可以看成是f(3)在加一个格子,原来第3个格子由于受到既不可以跟第一个格子相同,又不可以跟第2个格子相同的限制,导致第3个格子只有一种可能,现在再加第4个格子,使得第3个格子有了两张颜色可以选择。

  1. 按照原来f(3)的的第三格颜色不变,那么第四个格子只有一种颜色可以选择,在这种情况下,种类数仍然为f(3)。
  2. 现在第3个格子成为倒数第2个格子,可以跟第一个格子颜色相同,在这种情况下,第4个格子有两种颜色可以选择,种类数为2*f(2)

~~将这两种情况合起来就得到了f(4)的种类数,即f(4)=f(3)+f(2)*2
推广到一般情况,可以得出公式为f(n)=f(n-1)+f(n-2)*2 (n>3)
推到这里,我们就知道其实这道题用的方法就是递推

总结一下下
这种不能一样看出来的规律题,最重要的还是先用列举法,观察前后几项的潜在关系,再得出一般规律,只要找出一般的计算公式,后面写代码就很简单了呦,嘻嘻。

#include<stdio.h>
int main()
{
    
    
	int n,i;
	long long f[54];//注意要用long long哦~
	f[0]=3;
	f[1]=6;
	f[2]=6;
	for(i=3;i<54;i++) 
		f[i]=f[i-2]*2+f[i-1];
	while(~scanf("%d",&n))
		printf("%lld\n",f[n-1]);		
} 

猜你喜欢

转载自blog.csdn.net/weixin_43846755/article/details/87710673