hdu1297 Children’s Queue

 

公式的推导:

1)m

2)mff

3)mfff

a:安全序列后加ff或者m,结果仍然安全。

b:不安全序列后加ff可使其安全,虽然mf加f也能得到安全序列,但与a情况重复。

故:公式a[n]=a[n-1]+a[n-2]+a[n-4];

另外:还要考虑大数相加的问题:因为:n=1000时输出结果:

12748494904808148294446671041721884239818005733501580815621713101333980596197474

74433619974245291299822523591089179822154130383839594330018972951428262366519975

47955743099808702532134666561848656816661065088789701201682837073071502397487823

19037

#include <stdio.h>
#include <string.h>
char dpM[1100][1100],dpF[1100][1100]; 

void in_add(char s[], char max[],char min[])
{
	int l1=strlen(max);
	int l2=strlen(min);
	int yu=0,i;
	for(i=0;i<l2;i++)
	{
		s[i]=((yu + (min[i] - '1' + 1) + (max[i] - '1' + 1)) % 10) + '1' - 1;
		yu = ((yu + (min[i] - '1' + 1) + (max[i] - '1' + 1)) / 10);
	}
	for(i=l2;i<l1;i++)
	{
		s[i] = ((yu + max[i] - '1' + 1) % 10) + '1' - 1;
		yu = (( yu + max[i] - '1' + 1) / 10);
	}
	if(yu){
		s[l1] = yu + '1' - 1;
	}
}

void ADD(char s[] , char a[] , char b[])
{
	int l1=strlen(a);
	int l2=strlen(b);
	in_add( s, l1 >= l2 ? a : b, l1 < l2 ? a : b);
}

void Print( char max[], char min[])
{
	int l1=strlen(max);
	int l2=strlen(min);
	int s[1000];
	int yu=0,i;
	for(i=0;i<l2;i++)
	{
		s[i] = (yu + (min[i] - '1' + 1) + (max[i] - '1' + 1)) % 10;
		yu = (yu + (min[i] - '1' + 1) + (max[i] - '1' + 1)) / 10;
	}
	for(i=l2;i<l1;i++)
	{
		s[i] = ( yu + max[i] - '1' + 1) % 10;
		yu = ( yu + max[i] - '1' + 1) / 10;
	}
	if(yu) printf("%d",yu);
	for(i=l1-1;i>=0;i--)
	{
		printf("%d",s[i]);
	}
	printf("\n");
}
int main()
{
	int n;
	int i,l1,l2;
	strcpy( dpM[1] , "1");
	strcpy( dpF[1] , "0");
	strcpy( dpM[2] , "1");
	strcpy( dpF[2] , "1");
	
	for( i = 3; i <= 1000; i++)
	{
		ADD( dpM[i], dpF[i - 1], dpM[i - 1]);
		ADD( dpF[i], dpM[i - 2], dpF[i - 1]);
//		dpM[i] = dpF[i - 1] + dpM[i - 2];
//		dpF[i] = dpM[i - 1] + dpF[i - 1];
	}
	while(scanf("%d",&n)!=EOF)
	{
		l1=strlen(dpM[n]);
		l2=strlen(dpF[n]);
		Print( l1 >= l2 ? dpM[n] : dpF[n] , l1 < l2 ? dpM[n] : dpF[n]);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值