代码随想录算法训练营第43天| 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

  • 今日学习的文章链接,或者视频链接

第九章 动态规划 part05

  • 自己看到题目的第一想法

  • 看完代码随想录之后的想法

1049

class Solution {
public:
    int lastStoneWeightII(vector& stones) {
        vector dp(15001, 0);
        int target = 0;
        int sum = 0;
        for (int stone:stones){
            sum+=stone;
        }
        target = sum/2;
        for(int i = 0;i=stones[i];j--){
                dp[j] = max(dp[j],dp[j-stones[i]]+stones[i]);
            }
        }
        return (sum-dp[target]) - dp[target];

    }
};

494

一维数组:

class Solution {
public:
    int findTargetSumWays(vector& nums, int target) {
        vector dp(1001,0);
        dp[0] = 1;
        int sum = 0;
        for(int num : nums){
            sum+=num;
        }
        if((sum+target)%2==1) return 0;
        if (abs(target) > sum) return 0;
        int left = (sum+target)/2;
        for(int i = 0;i=nums[i];j--){
                dp[j] +=dp[j-nums[i]];
            }
        }
        //for(int i = 0;i

二维数组:

class Solution {
public:
    int findTargetSumWays(vector& nums, int target) {
        //二维dp
        int sum = 0;
        for(int num : nums){
            sum+=num;
        }
        if((sum+target)%2==1) return 0;
        if (abs(target) > sum) return 0;
        int left = (sum+target)/2;
        vector> dp(nums.size(),vector(left+1,0));
        for(int j = 0; j <= left; j++) {
            if(nums[0] == j) {
                dp[0][j] = 1;
            }
        }
        int numZeros = 0;
        for(int i = 0; i < nums.size(); i++) {
            if(nums[i] == 0) {
                numZeros++;
            }
            dp[i][0] = (int)pow(2, numZeros);
        }
        for(int i = 1; i < nums.size(); i++) {
            for(int j = 1; j <= left; j++) {
                if(nums[i] > j) {
                    dp[i][j] = dp[i - 1][j];
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]];
                }
            }
        }
        return dp[nums.size()-1][left];
    }
};

474

class Solution {
public:
    int findMaxForm(vector& strs, int m, int n) {
        vector> dp(m + 1, vector (n + 1, 0)); // 默认初始化0
        //遍历物品
        for(string str : strs){
            int oneNum = 0, zeroNum = 0;
            for (char c : str) {
                if (c == '0') zeroNum++;
                else oneNum++;
            }
            for(int i = m; i >= zeroNum; i--){
                for(int j = n; j>=oneNum;j--){
                    dp[i][j] = max(dp[i][j],dp[i-zeroNum][j-oneNum]+1);
                }
            }
        }
        return dp[m][n];

    }
};
  • 自己实现过程中遇到哪些困难

  • 今日收获,记录一下自己的学习时长

你可能感兴趣的:(算法)