hdu 2502 月之数(水)

点击打开链接

我推了很久,说一下我的想法,不知可不可行,我是这样想的,递推的话首先是去找F(N)与F(N-1)的关系,因为第一位只可能是一(从左往右看)可以先得到F(N)=F(N-1)+.........当第二位是1 的时候,即将F(N)可视为1与F(N-1)结合,对F(N-1)存在合法组合数(比如3的合法组合为100 101 110 111,即2^(3-1)种,而不是F(N-1) 的值,不要搞混淆了)从而此时可得到F(N)=F(N-1)+2^((N-1)-1)+.......从而当第二位为0时,同样可推到+2^(N-2)*1,现在得到的了F(N)相对于F(N-1)增加了1的总值(1*(N-1 位的组合数值)),F(N)=F(N-1)+2^(N-2)+2^((N-1)-1)+.......,,,当第一位是1且第二位是0时,就只需考虑后面N-2位的1的总值了,因为每位都可以为0和1,所以组合和数为2^(N-2)种,如果全是1的话,总值为(N-2)*2^(N-2);因为1和0出现的概率相同,各为50%,所以后(N-2)位总值是(N-2)*2^(N-2)/2,从而可推出F(N)=F(N-1)+2^((N-2)+2^((N-1)-1)+(N-2)*2^(N-2);

化简公式得 F(N)=F(N-1)+(N+2)*2^(N-3)   (N>=3)

#include<stdio.h>
#include<math.h>
int main()
{
	int nCase,n,i,a[21];
	scanf("%d",&nCase);
	while(nCase--)
	{
		scanf("%d",&n);
		a[1]=1;a[2]=3;a[3]=8;
		for(i=4;i<=n;i++)
			a[i]=a[i-1]+(i+2)*pow(2,i-3);
		printf("%d\n",a[n]);
	}
	return 0;
}


posted on 2012-08-06 16:11  Slege  阅读(148)  评论(0编辑  收藏  举报

导航