首页 > 其他 > 详细

279.完全平方数(动态规划)

时间:2020-02-23 18:35:39      阅读:98      评论:0      收藏:0      [点我收藏+]

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

技术分享图片

 

 

初始思路: 给定一个数比如1300,1300下一步分解就有 int( 1300**(0.5) +1) 种选择,再下一步又有很多种选择,这样自顶向下的分解方法无疑是不可行的。

 

dp思路,从底向上推,从1-1300 每一步的最小步数都存在dp中,这样可以避免很多重复计算。

 dp = [ for i in range( n + 1) ]

 

代码:

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [i for i in range(n+1)]
        for i in range(2,n+1):
            for j in range(1,int(i**(0.5))+1):
                dp[i] = min(dp[i],dp[i - j*j]+1)
        return dp[-1]
 
本题的技巧:
  1. 如果 i - j*j == 0: 刚好访问到 dp[ 0 ],则刚好本步为 dp[ 0 ] + 1 = 1
  2. 遍历n下的所有平方数,之后的哪个dp[ n - j*j ]大就取谁。
 
 
 
 

 

279.完全平方数(动态规划)

原文:https://www.cnblogs.com/ChevisZhang/p/12352985.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!