HDU 1480 钥匙计数二

用递归的思想去解题。
首先将最后一个凹槽各为1,2,3,4,5,6时,各设为一种情况
可以很快得出结论
钥匙总数=最后一个凹槽为1时的情况+2+3+4+5+6
容易看出1=6,2=3=4=5
那么简化为
钥匙总数=2*最后一个凹槽为1时的情况+4*最后一个凹槽为2时的情况。
要追加一个凹槽,需要分析两个情况
1、加上第n个凹槽之前,前面n-1个凹槽符合钥匙规则,那么
A情况,第n个凹槽中成员为2||3||4||5时,无论如何都符合构成钥匙的条件,那么情况A总数为:前面
n-1个凹槽时钥匙的总数
B情况,第n个凹槽成员为1||6时,要考虑到第n-1个凹槽是否为1||6。这里假设第n个凹槽成员为1,那么
第n-1个凹槽的成员就不能为6,容易得出B情况总数=(n-1)个凹槽时钥匙的总数-第n-1个凹槽数不为6的情况
2、加上第n个凹槽之前,前面n-1个凹槽并不符合钥匙规则,只有加上第n个凹槽后才符合钥匙规则。
A情况,第n个凹槽中成员为2||3||4||5时,前面必须只有两种类型,加上第n个凹槽才会符合规则,这样的类型组合
总共有C(5,2)种情况,这样的类型排列有2^(n-1)-2种情况。
B情况,第n个凹槽成员为1||6时,要考虑到第n-1个凹槽是否为1||6。假设第n个凹槽成员为1,那么当类型组合
中有一个是6时,这样的类型组合有C(4,1)(2,3,4,5)种,类型的排列总数有:2^(n-2)-1种情况(去掉一种全等情况)

将以上的值总和起来,易得出如下代码。


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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值