动态规划_leetcode279(动归版)

#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)

转载于:https://www.cnblogs.com/lux-ace/p/10546548.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值