您的位置:首页 > 其它

[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
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: