题目描述
题解
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]);
}
}
本文介绍了一种使用动态规划解决特定方块放置问题的方法。通过定义状态转移方程f[i]=f[i-2]×4-f[i-4],解决了在限定条件下如何将方块放置于格子中的问题,并提供了完整的C++代码实现。
4863

被折叠的 条评论
为什么被折叠?



