leetcode Day22 动规

128 阅读1分钟

343. 整数拆分

var integerBreak = function(n) {
    //dp[i]表示拆分i能得到的最大乘积
    const dp=new Array(n+1).fill(0)
    dp[2]=1
    for(let i=3;i<n+1;i++){
        for(let j=1;j<i;j++){
            dp[i]=Math.max(dp[i],dp[i-j]*j,j*(i-j))
        }
    }
    return dp[n]
};

96. 不同的二叉搜索树

var numTrees = function(n) {
    let dp=new Array(n+1).fill(0)
    dp[0]=dp[1]=1
    for(let i=2;i<n+1;i++){
        for(let j=1;j<i+1;j++){
            dp[i]+=dp[j-1]*dp[i-j]
        }
    }
    return dp[n]
};

416. 分割等和子集

var canPartition = function(nums) {
    let sum=nums.reduce((a,b)=>a+b)
    if(sum%2!==0)return false
    const dp=new Array(sum/2+1).fill(0)
    for(let i=0;i<nums.length;i++){
        for(let j=sum/2;j>=nums[i];j--){
            dp[j]=Math.max(dp[j],(dp[j-nums[i]]+nums[i]))
            if(dp[j]===sum/2){
                return true
            }
        }
    }
    return false
};

1049. 最后一块石头的重量 II

var lastStoneWeightII = function(stones) {
    let sum=stones.reduce((a,b)=>a+b)
    let h=Math.floor(sum/2)
    const dp=new Array(h+1).fill(0)
    for(let i=0;i<stones.length;i++){
        for(let j=h;j>=stones[i];j--){
            dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i])
        }
    }
    return sum-dp[h]*2
};