time limit: 2000/1000 ms (java/others) memory limit: 65536/32768 k (java/others)
total submission(s): 28032 accepted submission(s): 11192
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
sample output
分析:这是一个递推问题
1、数组 nums [ n ] 保存 n 个格子有多少种涂法。
2、n 个格子的涂法可以由 n - 1 个格子的涂法再加 1 个格子得到。n - 1 个格子涂好后,再加 1 个格子就只能涂 1 种颜色,所以nums [ n ] = nums [ n - 1 ] * 1
3、由 n - 1 个格子递推到 n 个格子的时候,会出现一个问题:原来 n - 1 个格子的首尾两个格子不能同色,加 1 个格子后,原来的 n - 1 个格子的首尾两个格子可以同色了!
4、在 n 个格子出现问题的基础上,反推可知:n - 1 个格子首尾同色的时候,n - 2 个格子肯定合法!所以,n - 1 个格子首尾同色,再加 1 个格子就可以涂 2 种颜色,所以nums [ n ] = num [ n - 2 ] * 2
5、综上所述:nums [ 1 ] = 3 ; nums [ 2 ] = 6 ; nums [ 3 ] = 6 ; nums [ n ] = nums [ n - 1 ] * 1 + nums [ n - 2 ] * 2