代码随想录day45

70. 爬楼梯

https://leetcode.cn/problems/climbing-stairs/
感觉直接是按照套路写了,多重背包问题

class Solution {
    public int climbStairs(int n) {
        int dp[]=new int[n+1];
        dp[0]=1;
        for(int j=0;j<=n;j++){
            for(int i=1;i<=2;i++){
                if(j-i>=0) dp[j]+=dp[j-i];
            }
        }
        return dp[n];
    }
}

322. 零钱兑换

https://leetcode.cn/problems/coin-change/
这个重点是要想到赋初始值问题,除了0都应该是最大限度。

dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);
class Solution {
    public int coinChange(int[] coins, int amount) { 
        int[] dp=new int[amount+1];
        dp[0]=0;
        for(int i=1;i<amount+1;i++){
            dp[i]=amount+1;
        }
        for(int j=0;j<amount+1;j++){
            for(int i=0;i<coins.length;i++){
                if(j-coins[i]>=0) dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);
            }
        }
        if(dp[amount]==amount+1) return -1;
        return dp[amount];
    }
}

279. 完全平方数

https://leetcode.cn/problems/perfect-squares/
和上一题差不多,但这道题目是一定有解的。

class Solution {
    public int numSquares(int n) {
        int[] dp=new int[n+1];
        for(int i=1;i<n+1;i++){
            dp[i]=n+1;
        }
        for(int j=0;j<n+1;j++){
            for(int i=1;i<Math.sqrt(n)+1;i++){
                if(j-(int)Math.pow(i,2)>=0) dp[j]=Math.min(dp[j],dp[j-(int)Math.pow(i,2)]+1);
            }
        }
        return dp[n];
    }
}
class Solution {
    public int numSquares(int n) {
        int[] dp=new int[n+1];
        for(int i=1;i<n+1;i++){
            dp[i]=n+1;
        }
        for(int j=0;j<n+1;j++){
            for(int i=1;i*i<n+1;i++){
                if(j-i*i>=0&&dp[j-i*i]!=n+1) dp[j]=Math.min(dp[j],dp[j-i*i]+1);
            }
        }
        return dp[n];
    }
}

你可能感兴趣的:(Leecode,leetcode,算法,动态规划)