512-汶川大震-重建希望小学
Problem Description
下面是部分受灾学校伤亡情况
…
为什么会有这么多的学校伤亡惨重?也许有很多值得我们调查的东西。但对于我们来说,当前最紧迫的任务是重建学校,以便让幸存的学生早日走进课堂。
这不,一所由社会各界捐款修建的希望小学马上就要竣工了!学校教室的长度为n米,宽度为3米,现在我们有2种地砖,规格分别是1米×1米,2米×2米,如果要为该教室铺设地砖,请问有几种铺设方式呢?
Input
输入数据首先包含一个正整数C,表示包含C组测试用例,然后是C行数据,每行包含一个正整数n(1<=n<=30),表示教室的长度。
Output
对于每组测试数据,请输出铺设地砖的方案数目,每个输出占一行。
Sample Input
2
2
3
Sample Output
3
5
这个题目虽然属于递归入门级的题目,但小编仍然想了2天才做出来,废话少说,直奔主题。
对于能用递归解决的题目一般都存在某种规律,本着这个思路,我们尝试画长为1、2、3米的教室,看看能否从中察觉出规律。
上图可以发现1 2 3米(画了部分)的情况下分别有1 3 5种情况,但这也为能发现规律(数据太少),不过我们可以仔细观察一下,不难发现,如果教室长度为3,那么我们可以在2的基础上增加1米(图中已用其他颜色标记),这一米全用来铺1 * 1地板砖,这1 * 1地板砖只有一种情况,而2米的情况一共有三种情况,所以这个时候3米就有三种情况。当然我们也可以在1米的基础上增加2米,铺这2米设2 * 2和1 * 1的地板砖,因为高度为3米,所以2 * 2只能铺上或下2种情况,所以这时候3米的情况有2*1(1米的教室情况)种情况,所以一共有3+2 * 1种情况。
推广到n米教室,则有f(n)=f(n-1)+f(n-2)*2种情况,n>=3
上代码
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
System.out.print("请输入教室的长度:");
int num=input.nextInt();
System.out.print("递归:"+fun(num));
}
public static int fun(int num) {
if(num==1) {
return 1;
}
if(num==2) {
return 3;
}
return fun(num-1)+2*fun(num-2);
}
若有错误,可在评论区留意,谢谢支持