编程之美--游戏之乐--1.4买书问题(改进解法)
2016-11-03 15:36
183 查看
原版解法以及改进解法均给出
改进解法思路展示:
原版解法
改进解法
通过改进算法,其实仍有更为优化的算法这里就不一一赘述
改进解法思路展示:
假设输入为[7,6,5,4,3] 通过某个过程达到了[3,3,3,3,3]这种状态 那么这时候的结果res+=5*0.25*3即可 不需要继续执行下去 同理 如果出现了[0,3,3,3,3]这种状态 那么这时候的结果res+=4*0.2*3即可 不需要继续执行下去 因此程序存在优化空间 在此我只给出第一种其中下的优化解法 之后的优化同理可以写出来
原版解法
#coding=utf-8 #author='HL' class Solution(): def solve(self,nums): nums = sorted(nums) res = self.in_Put(nums) return 8*(sum(nums)-res) def in_Put(self,nums): #print nums# ''' 用作测试程序调用次数 输入为[7,6,5,4,3]时 该程序调用了2万次左右 ''' res = 0 if self.is_Equal(nums): return 5*0.25*nums[0] if nums[0]>0: res = max(5*0.25+self.in_Put([ nums[i]-1 for i in range(len(nums))]),res) if nums[1]>0: res = max(4*0.2+self.in_Put(sorted(nums[:1]+[nums[i]-1 for i in range(1,len(nums))])),res) if nums[2]>0: res = max(3*0.1+self.in_Put(sorted(nums[:2] + [nums[i] - 1 for i in range(2, len(nums))])), res) if nums[3] > 0: res = max(2*0.05+self.in_Put(sorted(nums[:3] + [nums[i] - 1 for i in range(3, len(nums))])), res) return res def is_Equal(self,nums): for i in range(len(nums)-1): if nums[i]!=nums[i+1]: return False return True zz = Solution() print zz.solve([2,2,2,1,1])
改进解法
#coding=utf-8
#author='HL'
class Solution():
def solve(self,nums):
nums = sorted(nums)
res = self.in_Put(nums)
return 8*(sum(nums)-res)
'''
假设输入为[7,6,5,4,3] 通过某个过程达到了[3,3,3,3,3]这种状态 那么这时候的结果res+=5*0.25*3即可 不需要继续执行下去 同理 如果出现了[0,3,3,3,3]这种状态 那么这时候的结果res+=4*0.2*3即可 不需要继续执行下去 因此程序存在优化空间 在此我只给出第一种其中下的优化解法 之后的优化同理可以写出来'''
def in_Put(self,nums):
#print nums#
'''
用作测试程序调用次数
输入为[7,6,5,4,3]时
该程序调用了3千次左右
'''
res = 0
if self.is_Equal(nums):
return 5*0.25*nums[0]
if nums[0]>0:
res = max(5*0.25+self.in_Put([ nums[i]-1 for i in range(len(nums))]),res)
if nums[1]>0:
newnums = sorted(nums[:1] + [nums[i] - 1 for i in range(1, len(nums))])
if self.is_Equal(newnums):
res = max(4 * 0.2 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(4 * 0.2 + self.in_Put(newnums), res)
if nums[2]>0:
newnums = sorted(nums[:2] + [nums[i] - 1 for i in range(2, len(nums))])
if self.is_Equal(newnums):
res = max(3 * 0.1 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(3 * 0.1 + self.in_Put(newnums), res)
if nums[3] > 0:
newnums = sorted(nums[:3] + [nums[i] - 1 for i in range(3, len(nums))])
if self.is_Equal(newnums):
res = max(2*0.05 + 5 * 0.25 * newnums[0], res)
return res
else:
res = max(2 * 0.05 + self.in_Put(newnums), res)
return res
def is_Equal(self,nums):
for i in range(len(nums)-1):
if nums[i]!=nums[i+1]:
return False
return True
zz = Solution()
print zz.solve([7,6,5,4,3])
通过改进算法,其实仍有更为优化的算法这里就不一一赘述
相关文章推荐
- 编程之美 1.4买书问题常数时间空间解法
- 编程之美1.4-买书问题-解法1
- 读书笔记之编程之美 - 1.4 买书问题
- 编程之美3.7队列中取最大值操作问题(新解法,空间复杂度比原解法低)
- 2-sat问题,输出方案,几种方法(赵爽的论文染色解法+其完全改进版)浅析 / POJ3683
- 2-sat问题,输出方案,几种方法(赵爽的论文染色解法+其完全改进版)浅析 / POJ3683
- 《windows应用高级编程-C#编程篇》书中程序的小问题及改进
- 编程之美 1.4 买书问题
- 编程之美-快速寻找满足条件的2个数(扩展问题)的一个解法的注释
- 转:NIM(1)一排石头的游戏之扩展问题解法
- 游戏开发中的数据池问题和改进
- 编程之美 1.4 买书问题【贪心思路的分析】
- 编程解决各种问题(一) ----------------Flash 经典智力游戏(一) 人羊菜以及狼的故事
- 高效率安排见面会问题(比编程之美的解法复杂度低n-1个数量级)
- 学习游戏编程第一步就遇到的问题——SDK兼容性
- 编程之美1.4-买书问题-解法2
- Java编程能力强化(2)——搜索解决方案类问题的通用解法
- 编程之美-MIN(1)一排石头的游戏 扩展问题
- 《编程之美》2.7 最大公约数问题解法3改进
- 编程之美 一排石头的游戏(拓展问题)