代码随想录算法训练营第四十二天| 动态规划

Posted by Zhuoqun on February 24, 2023

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

这道题仅仅是理解了。还有问题没想明白:

  1. 为什么求总和的平均值就可以了?不会出现两边石头数量不对等,导致碰撞后的情况不是sum-dp[target]*2的情况吗?
  2. dp的大小设成15000就可以,还是一定要150001?因为我跑15000的时候,也没有报错
    class Solution {
    public:
     int lastStoneWeightII(vector<int>& stones) {
         vector<int> dp(15000,0);
         int sum = accumulate(stones.begin(),stones.end(),0);
         int target = sum/2;
         int total_size = stones.size();
         for(int i=0; i<total_size; i++){
             for(int j=target; j>=stones[i]; j--){
                 dp[j] = max(dp[j],dp[j-stones[i]]+stones[i]);
             }
         }
         return sum-dp[target]*2;
     }
    };
    

494. 目标和

看了评论里的一个提示,想到了这道题原来可以用回溯法做出来。虽然写的超时了,但是意思是对的。我写的超时了是因为我加了for loop,但其实有index+1的话,就不需要for loop了。因为这道题是要所有的数都带上,如果我写for loop的话,那势必会从第二位数再开始计算。但这对于本题没必要的。也说明了我不会根据题变通,回溯有背题的成分,而不是理解了。

class Solution {
public:
    int result = 0;

    void backtracking(vector<int>& nums, int sum,int index,int target){
        if(index == nums.size()){
            if(sum == target){
                result++;
            }
            return ;
        }
        else{
            backtracking(nums,sum+nums[index],index+1,target);

            backtracking(nums,sum-nums[index],index+1,target);
        }
    }
    int findTargetSumWays(vector<int>& nums, int target) {
        backtracking(nums,0,0,target);
        return result;
    }
};

474.一和零

这道题看了几遍题解都没看懂。放弃了