E. 【例题5】平铺方案
题目
题解
对于
2
∗
i
2*i
2∗i的矩阵:
若在第
i
i
i 列竖着放一个
1
∗
2
1*2
1∗2的瓦片,则有
f
[
i
−
1
]
f[i-1]
f[i−1]种方案。
若在第
i
i
i 列和第
i
−
1
i-1
i−1 列横着放两个
1
∗
2
1*2
1∗2的瓦片,则有
f
[
i
−
2
]
f[i-2]
f[i−2]种方案。
若在第
i
i
i 列和第
i
−
1
i-1
i−1 列放一个
2
∗
2
2*2
2∗2的瓦片,则有
f
[
i
−
2
]
f[i-2]
f[i−2]种方案。
所以
f
[
i
]
=
f
[
i
−
1
]
+
f
[
i
−
2
]
+
f
[
i
−
2
]
=
f
[
i
−
1
]
+
2
f
[
i
−
2
]
f[i]=f[i-1]+f[i-2]+f[i-2]=f[i-1]+2f[i-2]
f[i]=f[i−1]+f[i−2]+f[i−2]=f[i−1]+2f[i−2]
由于数据过大,需开高精才能过。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int f[251][1000],len[251]={0,0,0},t[1000];
int n;
void add(int k)
{
int s=0;
for(int i=0;i<=len[k-2];i++)
{
f[k][i]=f[k-2][i]+f[k-2][i]+s;
s=f[k][i]/10;
f[k][i]=f[k][i]%10;
}
len[k]=len[k-2];
if(s) f[k][++len[k]]=s;
s=0;
len[k]=max(len[k],len[k-1]);
for(int i=0;i<=len[k];i++)
{
f[k][i]=f[k][i]+f[k-1][i]+s;
s=f[k][i]/10;
f[k][i]=f[k][i]%10;
}
if(s) f[k][++len[k]]=s;
}
int main()
{
f[1][0]=1;
f[2][0]=3;
for(int i=3;i<=250;++i)
{
add(i);
}
while(cin>>n)
{
for(int i=len[n];i>=0;i--) printf("%d",f[n][i]);
printf("\n");
}
return 0;
}