不容易系列之(3)—— LELE的RPG难题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 40859 Accepted Submission(s): 16364
Problem Description
人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题:
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
以上就是著名的RPG难题.
如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
以上就是著名的RPG难题.
如果你是Cole,我想你一定会想尽办法帮助LELE解决这个问题的;如果不是,看在众多漂亮的痛不欲生的Cole女的面子上,你也不会袖手旁观吧?
Input
输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50)。
Output
对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
Sample Input
1 2
Sample Output
3 6
遇到的问题和解题思路:
这道题吧,说来也惭愧,本来想自己写的,结果傻傻的一个半小时没有写出来,不过也是刚刚入门,慢慢来吧。
刚开始自己的思路是将1 2 3 4 5的个数都列举了出来然后找规律。发现这样子太傻了,一直没有做出来。(个人感觉自己推理的方法有问题,大神们肯定都是用公式去推得,我还用数字去找规律TAT)
然后看了杭电上面别人的题解,感觉说的蛮好。首先是递推的思想:因为首位两个的颜色是不一样的,所以要看前面一个是什么颜色(即f(n-1))。在f(n-1)中,有两个颜色和首不同的,一种是相同的,相同的转变到前面的f(n)去那就是f(n-1),然后和首不同的有两个,这两个是由f(n-2)的和首相同的决定的,因为有两种改变的方式,所以就是2*f(n-2),因此递推关系式就出来了。
对了,千万不能忘了longlong 不然就超出int的范围了
给出代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int n; long long a[60]; int main(){ a[1] = 3; a[2] = 6; a[3] = 6; for(int i = 4;i < 55;i++){ a[i] = a[i-1]+ 2 * a[i-2]; } while(scanf("%d",&n)!=EOF){ printf("%I64d\n",a[n]); } return 0; }