摘要:
原题链接:96. 奇怪的汉诺塔 解题思路: 首先考虑n个盘中3座塔的经典问题,设d[n]表示求解改n盘3塔问题的最少步数,显然有d[n]=2*d[n-1]+1,既把前n-1个盘子从A柱移动到B柱,然后把第n个盘子从A柱移动到C柱,最后把前n-1个盘子从B柱移动到C柱。 回到本题,设f[n]表示求解n 阅读全文
摘要:
原题链接:95. 费解的开关 解题思路: 在上述规则的01矩阵的点击游戏中,很容易发现三个性质: 1.每个位置至多被点击一次 2.若固定了第一行(不能再改变第一行),则满足题意的点击方案至多只有一种。 其原因是:当第i行某一位为1时,若前i行已经被固定,只能点击第i+1行该位置上的数字才能使得第i行 阅读全文
摘要:
原题链接:94. 递归实现排列型枚举 解题思路: 该问题也称全排列问题,所有可能的方案总数有n!种。在这里,递归需要求解的问题是“把指定的n个整数按照任意次序排列”,在每次递归中,我们尝试把每个可用的数作为数列中的下一个数,求解“把剩余的n-1个整数按照任意次序排列”这个规模更小的子问题 样例代码: 阅读全文
摘要:
原题链接:93. 递归实现组合型枚举 解题思路 根据92.递归实现指数型枚举里的思路,我们只需要在上面指数型枚举程序的calc函数开头添加以下这条语句即可: if (chosen.size() > m || chosen.size() + (n - x + 1) < m) { return; } 这 阅读全文
摘要:
原题链接:92. 递归实现指数型枚举 解题思路 这等价于每个整数可以选可以不选,所有可能的方案总数有2的n次方种,通过前两节的学习我们已经知道可以进行一次循环,利用位运算来列举所有的选择方案。这一次我们使用递归来求解,在每一次递归中分别尝试某个数“选”还是“不选”两条分支,将尚未确定的整数数量减少1 阅读全文