题目分析要点
- 本题目是一个完全背包问题,每个数字可以无限制使用
- 数位中不会出现0,也就是不会有’011’这种不合法的数字
- 总成本必须为target
- 返回结果特别大,需要使用字符串来存数字,通过字符串比较数字大小的方法为:
- 两字符串不等长,长的那个比较大
- 两字符串等长,从高位向地位逐个比较,大的那个比较大
解题思路一
利用dfs遍历的方法在所有可能的结果中,直到数位的cost成本总和达到target
1 | class Solution: |
但上面的代码是比较投机取巧的方式,利用python没有溢出的特性实现
解题思路二
采用动态规划的方式,我们定义一个dp数组,i为range(0,target+1),dp[i]为一个列表,里面保存了用来构成总成本i的数字,假设dp[k],k=0,1,2,..i-1的最优策略已经求出,那么对于dp[i]而言,他的最优策略就应该从dp[i-cost[j]]+[j+1],j=0,1,…,8中选取,对于某一个特定的j,假设dp[i-cost[j]]的最优策略构成为[x1,x2,..,xm],则在其中插入j+1的位置是不确定的,但从要点分析中知,对于等长的字符串,数字字位大的在前的字符串数字较大,因此我们可以对其进行排序,然后进行比较
1 | class Solution: |
但是上面的代码运行是很慢的,原因有两个
- 频繁执行copy操作
- 频繁执行列表的排序操作
解题思路三
上面的代码运行太慢,原因在于频繁的排序操作,回到要点分析,可以知道如果我们贪心的每次都选择最大值来构成可能的字符串,那么对于’777’这样的一个字符串,如果他的下一个可能的字位为’6’,那么6插在’777’的最后才可以构成最大的数字,可以节省很多的排序操作。
1 | class Solution: |
本文作者:
ketsudou
发布时间: 2020-05-18
最后更新: 2020-05-18
本文标题: 第26场双周赛最后一题
本文链接: http://huangketsudou.github.io/2020/05/18/competeD26/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处
发布时间: 2020-05-18
最后更新: 2020-05-18
本文标题: 第26场双周赛最后一题
本文链接: http://huangketsudou.github.io/2020/05/18/competeD26/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处