您的位置:首页 > 其它

HDU 1143 Tri Tiling(dp)

2016-03-31 10:50 435 查看
Description

用1*2的骨牌放满3*n的矩形有多少种方法

Input

多组用例,每组用例占一行为一整数n,以-1结束输入(0<=n<=30)

Output

对于每组用例,输出方法数

Sample Input

2

8

12

-1

Sample Output

3

153

2131

Solution

用dp
表示放满前n列的方案数,n为奇数时显然没有合法方案,n为偶数时考虑最右边一个分割线的位置,那么这个位置只可能取n-2,n-4,…,2,该位置为n-2时,右边两列有三种放法,而该位置取其他值时,若要保证m列中没有分割线只有两种放法(m=4时如下图)





据此可以得到转移方程

dp
=3*dp[n-2]+2*(dp[n-4]+dp[n-6]+…+dp[2])

同理有dp[n-2]=3*dp[n-4]+2*(dp[n-6]+dp[n-8]+…+dp[2])

两式做差得dp
=4*dp[n-2]-dp[n-4],之后以dp[0]=1,dp[2]=3为起点递推即可

Code

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 33
int n,dp[maxn];
int main()
{
memset(dp,0,sizeof(dp));
dp[0]=1,dp[2]=3;
for(int i=4;i<maxn;i+=2)dp[i]=4*dp[i-2]-dp[i-4];
while(~scanf("%d",&n),~n)printf("%d\n",dp
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: