[POJ2663]Tri Tiling(dp)

245 篇文章 0 订阅

题目描述

传送门

题解

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[n]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值