原版解法以及改进解法均给出
改进解法思路展示:
假设输入为[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])
通过改进算法,其实仍有更为优化的算法这里就不一一赘述