트라이 타일
기사 디렉토리
주제 설명 :
입력:
Input consists of several test cases followed by a line
containing -1. Each test case is a line containing an
integer 0 ≤ n ≤ 30.
산출:
For each test case, output one integer number giving the
number of possible tilings.
Smaple 입력 :
2
8
12
-1
샘플 출력 :
3
153
2131
효과에 따라 :
이 넓은 사각형 3을 제공하지만, 길이는 N (결정하여 입력), 너무 오래 사각형에 의해 요구한다면, 이제 2 사각형 1, 사각형의 폭이 있기 때문에 * N, (3)가 구성하는 것입니다 얼마나 많은 방법.
아이디어의 분석 :
这道题知道如何向你们解释,自己画图又丑,借助一下大佬的图片
来解释一下思路吧(以下纯属个人理解,如果有错,请大佬们指出)。
首先我们可以很清楚知道如果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=2有3种方式),那么换做右边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)
从4和6可以得出规律来
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]
반복적으로왔다 후 확인이에 대한 이해를 바라고, 여기 사진의 족장으로, 테이블 출력을 재생하기 위해 함께 추가된다.
#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;
}
}