码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划_leetcode279(动归版)

时间:2019-03-17 13:24:47      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:记忆化   col   square   递归   return   turn   规划   print   utf-8   

#coding=utf-8

# 递归版
class Solution1(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""

return self.squareNum(n)


def squareNum(self,n):

if n == 0:
return 0

if n == 1:
return 1

res = n

for i in range(1,n):
if n - i ** 2 >= 0:
res = min(res, 1 + self.squareNum(n- i ** 2))


return res

# s = Solution1()
#
# print s.numSquares(13)

# 记忆化递归
class Solution2(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""

self.memo = [-1 for i in range(n+1)]

return self.squareNum(n)


def squareNum(self,n):

if n == 0:
self.memo[0] = 0
return 0

if n == 1:
self.memo[1] = 1
return 1

res = n

for i in range(1,n):
if n - i ** 2 >= 0:
if self.memo[n- i ** 2] != -1:
res = min(res, 1 + self.memo[n- i ** 2])
else:
self.memo[n - i ** 2] = self.squareNum(n - i ** 2)
res = min(res, 1 + self.memo[n- i ** 2])


return res

# s = Solution2()
#
# print s.numSquares(40)

# 动归
class Solution3(object):
def numSquares(self, n):

return self.squareNum(n)

def squareNum(self, n):

self.memo = [n for i in range(n + 1)]

self.memo[0] = 0
self.memo[1] = 1

# #memo[2]
# for i in range(1, 2):
# if n - i ** 2 >= 0:
# self.memo[2] = min(self.memo[2],1+self.memo[n - i ** 2])
#
#
# #memo[3]
# for i in range(1, 3):
# if n - i ** 2 >= 0:
# self.memo[3] = min(self.memo[3],1+self.memo[n - i ** 2])



for i in range(1,n+1):
for j in range(1,i):
if i - j ** 2 >= 0:
self.memo[i] = min(self.memo[i], 1 + self.memo[i - j ** 2])


return self.memo[n]



s = Solution3()

print s.numSquares(7691)

动态规划_leetcode279(动归版)

标签:记忆化   col   square   递归   return   turn   规划   print   utf-8   

原文地址:https://www.cnblogs.com/lux-ace/p/10546548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!