HDOJ_1480 钥匙计数之二 解题报告(…

  1. Problem Description
  2. 一把钥匙有N个槽,2<N<26槽深为1,2,3,4,5,6。每钥匙至少有3个不同的深度且相连的槽其深度之差不得为5。求这样的钥匙的总数。
  3. Input
  4. 本题无输入
  5. Output
  6. 对2<N<26,输出满足要求的钥匙的总数。
  7. Sample Output
  8. N=3: 104
  9. N=4: 904
  10. N=5: 5880
  11. N=25: 8310566473196300280
  12. 解题思路:
  13. 设lock[i]表示:有 i个槽的钥匙的个数
  14. 设one[i]表示:有 i个槽且左边第一个槽深度为1的钥匙的个数
  15. 设two[i]表示:有 i个槽且左边第一个槽深度为2的钥匙的个数
  16. ..
  17. ..
  18. 设six[i]表示:有 i个槽且左边第一个槽深度为6的钥匙的个数
  19. 则显然:lock[i]=one[i]+two[i]+ three[i]+four[i]+five[i]+six[i]
  20. 由于易知:one[i]=six[i],two[i]=three[i]=four[i]=five[i]
  21. 则可以得到:lock[i]=one[i]*2+two[i]*4
  22. 其中:
  23. one[i]=one[i-1]+two[i-1]+three[i-1]+four[i-1]+five[i-1]+a[i];
  24.       =one[i-1]+two[i-1]*4 +a[i]
  25.      
  26. two[i]=one[i-1]*2+two[i-1]*4 +b[i]
  27. 其中,a[i] 和b[i]的含义分别是:
  28. a[i]表示“有 i个槽且左边第一个槽深度为1,同时这种钥匙在除掉第一个槽后不再是钥匙”的钥匙的个数。
  29. 例如 123,124,125,134,135,145,126,136,146,156 就属于这种情况。
  30. b[i]表示“有 i个槽且左边第一个槽深度为2,同时这种钥匙在除掉第一个槽后不再是钥匙” 的钥匙的个数。
  31. 分析到这里,可以知道,关键的是求a[i]和b[i],我们可以得到如下表达式:
  32. a[i]=(2^(i-1)-2)*6+(2^(i-2)-1)*4
  33. b[i]=(2^(i-1)-2)*9
  34. 其中,a[i] 的各部分的含义如下:
  35. (2^(i-1)-2)*6:
  36. 当去掉第一位,后面i-1位只有 (2,3)或者 (2,4) 或者(2,5) 或者(3,4) 或者(3,5) 或者(4,5)两种数字的时候,显然是不合法的钥匙(不满足至少有3个不同的深度),加上第一位的1则显然是一个合格的钥匙。所以后面的数字可以为一个组合中两个数字的任意一个,根据乘法原理i-1位一共有2^(i-1)种组合,当然还需要去掉两种特殊情况,就是后面i-1位完全相同的情况。满足这种条件的一共有上面六种组合,所以得到(2^(i-1)-2)*6。
  37. (2^(i-2)-1)*4:
  38. 当去掉第一位,后面i-1位只有 (2,6)或者 (3,6) 或者(4,6) 或者(5,6)两种数字的时候,显然是不合法的钥匙(不满足至少有3个不同的深度),加上第一位的1则“可能”是一个合格的钥匙。因为要注意满足“相连的槽其深度之差不得为5”这个条件,所以,紧跟着1的绝对不能是6,这样,相对于上面的分析,后面i-2位可以是每组中的任意一个,所以有2^(i-2),还要减去1是因为同样要排除后面全部是和第2位一样的数字这样的情况。满足这种条件的一共有上面的四种组合,所以得到(2^(i-2)-1)*4。
  39. b[i] 的含义如下:
  40. (2^(i-1)-2)*9:
  41. 当去掉第一位,后面i-1位只有 (1,3)或者 (1,4) 或者(1,5) 或者(3,4) 或者(3,5) 或者(3,6) 或者(4,5) 或者(4,6) 或者(5,6) 两种数字的时候,显然是不合法的钥匙(不满足至少有3个不同的深度),加上第一位的1则显然是一个合格的钥匙。所以后面的数字可以为一个组合中两个数字的任意一个,根据乘法原理i-1位一共有2^(i-1)种组合,当然还需要去掉两种特殊情况,就是后面i-1位完全相同的情况。满足这种条件的一共有上面9种组合,所以得到(2^(i-1)-2)*9。
  42. 目前为止,我们可以求出所有的a[i]和b[i],而且知道了递推关系,只要再做一点简单的工作就可以了,那就是还需要初始值,当然,很容易枚举出最简单的情况
  43. one[3]=16;
  44. two[3]=18;
  45. 这样,整个问题就解决了。
  46. 特别说明:
  47. 这种递推的题目,就是从f(i-1) 加一个元素,然后枚举出所有可能的情况,推导到f(i),当然这个题目有点麻烦,但是套路是一样的,大家也可以参考一下以前的special number课件,里面对于hdoj_1133 Buy the Ticket这个题目的分析,里面的思路和这个完全一样。
  48. 附:
  49. 完全输出是:
  50. N=3: 104
  51. N=4: 904
  52. N=5: 5880
  53. N=6: 35080
  54. N=7: 203224
  55. N=8: 1165224
  56. N=9: 6656760
  57. N=10: 37980360
  58. N=11: 216600344
  59. N=12: 1235066344
  60. N=13: 7042019640
  61. N=14: 40150936840
  62. N=15: 228923909464
  63. N=16: 1305225588264
  64. N=17: 7441828166520
  65. N=18: 42430052360520
  66. N=19: 241917592818584
  67. N=20: 1379308210234984
  68. N=21: 7864211495849400
  69. N=22: 44838290466987400
  70. N=23: 255648298611935704
  71. N=24: 1457594655514830504
  72. N=25: 8310566473196300280
  73. ……
  74. 这个题我还没有做出来,等待更新中……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值