[POJ2663]Tri Tiling(dp)
2016-05-22 16:13
239 查看
题目描述
传送门题解
f[i]表示把前i列放好的方案数。如果是奇数列的话是一定放不好的,所以我们将两列看作一个单位。首先如果将3行2列的方格填满有3中方案,那么当只在当前的单位放的时候,f[i]=f[i-2]×3;如果有一些方块跨单位放,在相邻的2n单位,如果每一个单位和单位之间都至少有一个方块跨单位放的话,一共有2种方案,所以f[i]=2×(f[i-2]+f[i-4]+f[i-6]+……+0);
综合起来,f[i]=f[i-2]×3+2×(f[i-2]+f[i-4]+f[i-6]+……+0)=f[i-2]×4-f[i-4]。
代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define LL long long int n;LL f[50]; int main() { f[0]=1; f[2]=3; for (int i=4;i<=30;i+=2) f[i]=4*f[i-2]-f[i-4]; while (~scanf("%d",&n)) { if (n==-1) return 0; printf("%I64d\n",f ); } }