HDU 1483 钥匙计数之一(详细过程)

HDU 1438  钥匙计数之一


Problem Description
一把锁匙有N个槽,槽深为1,2,3,4。每锁匙至少有3个不同的深度且至少有1对相连的槽其深度之差为3。求这样的锁匙的总数。
 

Input
本题无输入
 

Output
对N>=2且N<=31,输出满足要求的锁匙的总数。
 

Sample Output
  
  
N=2: 0 N=3: 8 N=4: 64 N=5: 360 .. .. .. .. .. .. .. N=31: ...



又是一题递推题,用递推的思路去解。
说来惭愧,做这题的时候有个地方卡住了,直到看了别人的解题报告才豁然开朗(数学没学好。。)


将lock[n]计做n个凹槽时,符合要求的钥匙总数.
将one[n]计做n个凹槽时,第n个凹槽为1时符合要求的钥匙总数.
将two[n]计做n个凹槽时,第n个凹槽为2时符合要求的钥匙总数.
且1=4,2=3;


对与第n个凹槽,有两种情况。
 1.前n-1个凹槽以构成钥匙,那么对于第n个凹槽而言,无论第n个凹槽为1/2/3/4,都有lock[n-1]种情况。


 2.前n-1个凹槽未构成钥匙,加了第n个凹槽后才符合钥匙规则,那么分两种情况


A.当第n个凹槽为 2/3时,前面n-1个凹槽必须为1/4构造而成的,出去两种全为1/4的情况,即2^(n-1)-2种情况
B.当第n个凹槽为1/4时,前面n-1个凹槽的构成有多种情况,将这多种情况分析清楚:
假设第n个凹槽为1:
则前面n-1个凹槽的构成情况有如下几种
{
A1.前n-1个凹槽由4种类型组成,但未有相邻两个凹槽高度差为3的。
A2.前n-1个凹槽由4种类型组成,有相邻两个凹槽高度差为3的。
B1.前n-1个凹槽由3种类型组成,但未有相邻两个凹槽高度差为3的。
B2.前n-1个凹槽由3种类型组成,有相邻两个凹槽高度差为3的。
C1.前n-1个凹槽由2种类型组成,但未有相邻两个凹槽高度差为3的。
C2.前n-1个凹槽由2种类型组成,有相邻两个凹槽高度差为3的。
D. 前n-1个凹槽由1种类型组成。
}
由已知条件“前n-1个凹槽未构成钥匙,加了第n个凹槽后才符合钥匙规则”
可以将A2,B2,C2,D的全部情况排除,推得结论n-1个凹槽上必须为4,才符合已知条件。
即:A1+B1+C1=all-(A2+B2+C2+D)=1*4^(n-2)-(one[n-1]+1*2^(n-2)-1+1)


综合以上两种情况:
one[n]=4^(n-2)-(one[n-1]+2^(n-2))+lock[n-1]
two[n]=2^(n-1)-2+lock[n-1]
lock[n]=2*(one[n]+two[n])

代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
	__int64 one[32]={0},two[32]={0},lock[32]={0};
	one[3]=2;
	lock[2]=0;
	lock[3]=8;
	printf("N=2: 0\n");
	printf("N=3: 8\n");
	for(int n=4;n<32;n++)
	{
	one[n]=(__int64)pow((float)4,n-2)-(__int64)pow((float)2,n-2)-one[n-1]+lock[n-1];
	two[n]=(__int64)pow((float)2,n-1)-2+lock[n-1];
	lock[n]=2*(one[n]+two[n]);
	printf("N=%d: %I64d\n",n,lock[n]);
	}
	getchar();
	return 1;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值