DP训练~Tri Tiling(入门)~解题报告

Tri Tiling

题目描述:

在这里插入图片描述

Input:

Input consists of several test cases followed by a line 
containing -1. Each test case is a line containing an 
integer 0 ≤ n ≤ 30. 

Output:

For each test case, output one integer number giving the 
number of possible tilings. 

Smaple Input:

2
8
12
-1

Sample Output:

3
153
2131

题目大意:

就是有一个矩形给出了宽是3,但是长是n(你输入来决定),那么现在有长为2,宽为1的矩形,问如果用该矩形去拼成3*n的矩形,有多少种方法。

思路分析:

这道题知道如何向你们解释,自己画图又丑,借助一下大佬的图片
来解释一下思路吧(以下纯属个人理解,如果有错,请大佬们指出)。
首先我们可以很清楚知道如果n为奇数的时候,是不可能有方法拼出来的,
所以必须要考虑偶数列来判断情况,我们可以知道如果n为2的时候有3种
方法去拼,分别为F[2]=3

在这里插入图片描述

我们这里继续深推下去,当n变成4的时候,这时候你可能会想,可不可以
用n=2的摆放方法来摆放它,显然是可以的,并且它还多出2种以下方法,
那么我们可以这样得出F[4]=3*F[2]+2.(这里如果不懂为什么3*F[2]的话
解释一下)因为我们有3种不同的方法,一种方法可以搭配3种方法(包括
自身,那么就有3*3种方法去搭配)再加上以下多出来2

在这里插入图片描述
以及反过来
在这里插入图片描述

这里继续深推下去,我们可以计算出当n=6时,它是否像n=4的时候,用n=2
的方法去搭配,答案是可以的,

 1.我们这里做下简化,当n=6的时候,左边为n=4,右边为n=2,那么可以
 这样想,只要将他们2边所用的方法数加2,就是n=6的方法 。
 
 2. 因为n=4中包括n=2的方法,不如这样想,n=4可以与右边n=2搭配有3
 种不同方式(因为n=23种方式),那么换做右边n=2,去与n=4搭配,这时
 可以想n=4可以变成n=2或者不变,那么右边的n=2可以与左边n=2搭配,或者
 与n=4搭配,就有2种,这时候就可以得出:
 有F[4]*3,那么同理也有F[2]*2,就可以得出
 F[6]=F[4]*3+F[2]*2+2

在这里插入图片描述
在这里插入图片描述

已经得出了F[2]和F[4]和F[6]的公式后,不妨对比一下:
F[2]=3;
F[4]=F[2]*3+2*1
F[6]=F[4]*3+2*(F[2]+1)
从46可以得出规律来
F[n]=F[n-2]*3+2*(F[n-4]+F[n-6]+........)+2
那么这里就会问了那F[0]等于多少,答案很显然应该是1.这样才能满足条件
因为F[0]=1,那么公式还可以继续简化:
F[n]=F[n-2]*3+2*(F[n-4]+F[n-6]+........+F[0])
并且
F[n-2]=F[n-4]*4+2*(F[n-6]+...........+0)(这里因为F[-1]=0
都为负数了,哪来的方法,所以GG)
将2式相减得:
F[n]=4*F[n-2]-F[n-4]

已经得出了递归方式,那么加上打表加输出就OK了,这里借助一下大佬的图片,希望体谅一下。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
long long dp[31];
int LemonDP()
{
	dp[0]=1;
	dp[2]=3;
	for(int i=4;i<=30;i+=2)
	{
		dp[i]=4*dp[i-2]-dp[i-4];
	}
}
int main()
{
	int b;
	LemonDP();
	while(cin >> b && b!=-1)
	{
		cout << dp[b] << endl;
	}
}
发布了65 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xiaosuC/article/details/104522476
今日推荐