hdu 1143 Tri Tiling (DP)

点击打开链接

转载:开始也是想递推的,但是发现递推的过程中有重复计算,所以便下结论此题不是递推,然后就不会做了。后来看了人家大牛的解法,发现确实是递推,而且避免重复计算的过程的公式为f[n]=f(2)*f[n-2]+2*(f[n-4]+f[n-2]+...+f[0])(其中f[0]约定为1)。公式是这样解释的:我们从右往左定顺序,首先是划分为n-2,和2两部分,则为f[n-2]*f[2],然后划分为n-4和4两部分,但是4的部分不能分解为2,2(否则重复计算了)。我尝试着画了下只有两种。然后划分为n-6和6两部分,但是6的部分不能分解为2,4或4,2或2,2,2。也只有两种,依次类推。变得公式了。AC代码如下:

#include"stdio.h"
int main()
{
	int i,j,n;
	int f[33];
	f[0]=1;f[2]=3;
	for(i=4;i<=30;i++)
	{
		f[i]=f[2]*f[i-2];
		j=i-4;
		while(j>=0)
		{
			f[i]+=2*f[j];
			j-=2;
		}
	}
	while(scanf("%d",&n),n!=-1)
	{
		if(n%2==0)
			printf("%d\n",f[n]);
		else
			printf("0\n");
	}
	return 0;
}


转载于:https://www.cnblogs.com/yyf573462811/archive/2012/10/22/6365179.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值