动态规划(分割整数)---按平方数来分割整数

按平方数来分割整数

279. Perfect Squares(Medium)

题目描述:

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

思路分析:

  将n以内的平方数都求出来,然后设置数组dp[i],表示整数i按平方数分割的个数,则dp[n]表示整数n按平方数分割的个数,那么我们可以得到状态转移方程dp[i]=dp[i-square]+1。

代码:

public int numSquares(int n){
    List<Integer>squareList=generate(n); //生成n以内的所有平方数
    int []dp=new int[n+1];
    for(int i=1;i<=n;i++){
        int min=Integer.MAX_VALUE;
        for(int square:squareList){
            if(square>i) //平方数比当前的n还大,那么退出
                break;
            min=Math.min(min,dp[i-square]+1);
        }
        dp[i]=min;
    }
    return dp[n];
}
public List<Integer>generate(int n){ //生成平方数
    List<Integer>res=new ArrayList<>();
    int square=1;
    int diff=3;
    while(square<=n){
        res.add(square);
        square=square+diff;
        diff=diff+2;
    }
    return res;
}
posted @ 2019-07-01 20:19  yjxyy  阅读(588)  评论(0编辑  收藏  举报