- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Hdu1480钥匙计数之2解题报告
PAGE
PAGE 5
Hdu1480钥匙计数之二解题报告
/*
Name: hdu1480
Copyright: ecjtu_acm训练基地
Author: yimao
Date: 17-06-10 20:59
Description: 解题报告
*/
一、题目
Problem Description
一把钥匙有N个槽,2N26槽深为1,2,3,4,5,6。每钥匙至少有3个不同的深度且相连的槽其深度之差不得为5。求这样的钥匙的总数。
Input
本题无输入
Output
对2N26,输出满足要求的钥匙的总数。
Sample Output
N=3: 104
N=4: 904
N=5: 5880
.
.
.
N=25: 8310566473196300280
二、题目分析
提交完本题后,颇觉有递推的味道。
出发点:构造结果ans[n]=num[1]+……+num[6];其中num[i]表示以i为最后一个槽的高度;计算出num[i],从而得出结果。
首先进行初始化分析,即n=3时。
“相连的槽其深度之差不得为5”——1,6这两个高度不能相邻;而2,3,4,5这四个高度等价,且之后n=4,5,……25的计算过程中均有此规律。即num[1]=num[6],num[2]=num[3]=num[4]=num[5],在写代码时注意到这点便可以不需要用到数组;
num[1]=num[6]=16;num[2,3,4,5]=18;
ans[3]=104;
(下面是重点)
再由n-1递推分析n的情况:
当前面n-1个排列是钥匙的排列,则
对2,3,4,5作为第n个高度来说都能满足题意,有num[2,3,4,5]=ans[n-1];
对1,6(1,6等价,记号不同而已)来说,第n-1个高度不能为6,1,即要去掉
几个不符合题意的组合;num[1]=ans[n-1]-num__[6](前n-1个中最后一个为6的个数,实际写代码时要用另一个数组保存)。同理 num[6]=ans[n-1]-num__[1](……)。也即num[1,6]=ans[n-1]-num__[6](……);
当前面n-1个排列不是钥匙的排列,则
A、对i(i=2,3,4,5)作为第n个高度来说能满足钥匙的要求,则说明前面n-1个排列里仅有两类高度,且与i不同,加上i就刚好3类高度满足题意。那么前面两类高度的选法总数是从其余5类高度里选出两类,即C(5,2),但1,6不能同时选,故组合数为
C(5,2)-1。 再看排列数,n-1个位置,每个位置可任选两类,但不能全部是同一类高度,故排列数2^(n-1)-2。
B、对i=1,6,同上面分析。因为1,6等价,所以我这里举i=1来说,前面两类高度里我有两种取法,选6和不选6。
对于选6,组合数是C(4,1)(剩下2,3,4,5任意选一);再看排列数,每个位置可任选两类,但不能全部是同一高度,且最后一个也即第n-1个位置处不能为6,也可换个说法,最后一个位置放i(i=2,3,4,5),前面n-2个位置任选6和i放,排列数4×2^(n-2)。
对于不选6,组合数是C(4,2);再看排列数,每个位置可任选两类,且不能全部是同一类高度,排列数2^(n-1)-2。
把上面的组合数与排列数相乘便得到一种情况下的num[i]的值,所有情况的值相加便得到结果。
三、代码(从简)
/*Accepted 1480 0MS 192K 743B G++ */
t[6]=16;ans[3]=104;
for(i=4;i26;i++)
{
//前n-1是钥匙的情况;
num[1]=ans[i-1]-t[6];
num[2]=ans[i-1];
//前n-1不是钥匙的情况;
num[1]+=c42*(mult(2,i-1)-2); //不含有6;mult()算阶乘;
num[1]+=4*(mult(2,i-2)-1); //含有6;
num[2]+=(c52-1)*(mult(2,i-1)-2);
ans[i]=2*num[1]+4*num[2];
t[6]=num[1];
}
/*以上代码可以不写mult函数,在数据量大的情况下能省很多时间,请读者自己思考,
以上代码可以不写数组,在数据量大的情况下能省内存占用。希望读者完善之*/
四、总结(略)
刚开始接触这题,有点恐惧,尽管自己手动分析了n=3,4的情况,感觉情况似乎很多种,不敢往下接着想,和以前做这类题
您可能关注的文档
最近下载
- 【苏教版】初中七年级上册同步练习及单元测试(全册)(含答案).pdf VIP
- 山东省烟台市(新版)2024小学语文部编版小升初测试(培优卷)完整试卷(含答案).docx VIP
- 《干法》稻盛和夫.pdf-2019-02-13-13-27-03-150.docx VIP
- 筋伤-踝部筋伤(中医骨伤科学十三五教材)【57页】.pptx VIP
- 室内装修改造施工组织设计.pdf VIP
- 加利福尼亚州驾驶员手册简体中文版.pdf VIP
- 初中物理跨学科设计方案.docx VIP
- 毕业设计总结集锦3篇.docx VIP
- 2025年股东董事增资备忘录.docx VIP
- 八年级物理声现象单元测试卷.doc VIP
文档评论(0)