Hdu1480钥匙计数之2解题报告.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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的情况,感觉情况似乎很多种,不敢往下接着想,和以前做这类题

文档评论(0)

shaoye348 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档