码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 随想录一刷Day43——动态规划


    文章目录

    • Day43_动态规划
      • 14. 最后一块石头的重量 II
      • 15. 目标和
      • 17. 一和零

    Day43_动态规划

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

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

    要让最后剩下的石头的重量最小,即消磨得石头的重量越多,即让重量尽可能接近的石头两两相碰。于是可以统计石头的总重量sum,将问题转化为,在容量为sum/2的背包中放入尽可能重的石头,这样背包中的石头与没有装入背包的石头互相碰撞,最后一定能消磨到只剩 sum - dp[target] - dp[target] 的重量。
    粗糙证明一下结论正确性,如果没有将背包中装入最大的重量,一定有石头本可以装入背包而没有装入背包,那么消磨掉背包中的石头后,没有装入背包的石头还需要彼此消磨,直到把本可以装进去却没装进去的部分消磨掉,相当于装进了背包,所以上述方法是正确的。

    class Solution {
    public:
        int lastStoneWeightII(vector<int>& stones) {
            int stones_size = stones.size();
            int sum = 0;
            for (int i = 0; i < stones_size; ++i) sum += stones[i];
            int target = sum / 2;
            vector<int> dp(target + 1, 0);
            for (int i = 0; i < stones_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] - dp[target];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    15. 目标和

    494. 目标和
    思路:

    1. dp[j] 表示填满容量 j 的种类数
    2. d p [ j ] = ∑ d p [ j − n u m s [ i ] ] dp[j] = \sum{dp[j - nums[i]]} dp[j]=∑dp[j−nums[i]]
    3. 初始化 dp[0] = 1 ,填满容量 0 的方法数有一种,就是不填
    4. 外层循环遍历整个nums[]数组,内层循环倒序遍历背包容量,因为扩展到二维用的是上一行的处理结果,从前往后的话会更新前面的结果,导致后面的计算出错。

    设nums中正数相加的和为 positive_sum
    则有 positive - (sum - positive) = target
    将问题转化为求整数之和为 positive_sum = (sum + target) / 2 的方法数,使用 01 背包,求容量为 positive_sum 的背包被装满的方法数

    class Solution {
    public:
        int findTargetSumWays(vector<int>& nums, int target) {
            int nums_size = nums.size();
            int sum = 0;
            for (int i = 0; i < nums_size; ++i) sum += nums[i];
            if (abs(target) > sum) return 0;
            if ((sum + target) & 1) return 0; // positive - (sum - positive) = target
            int positive_sum = (target + sum) / 2; // 
            vector<int> dp(positive_sum + 1, 0);
            dp[0] = 1; // 初始化
            for (int i = 0; i < nums_size; ++i) {
                for (int j = positive_sum; j >= nums[i]; j--) {
                    dp[j] += dp[j - nums[i]];
                }
            }
            return dp[positive_sum];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    17. 一和零

    474. 一和零
    思路:

    经典 01 背包,只不过容量分两维,0的容量一维,1的容量一维。每个字符串带来的价值是1.

    class Solution {
    public:
        int findMaxForm(vector<string>& strs, int m, int n) {
            vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0));
            for (string str : strs) {
                int ZeroNum = 0, OneNum = 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];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    【centos编译安装opentsdb,执行./build.sh时报错无法下载jar包】
    原型链中:为什么Function.proto==Function.prototype?
    数字藏品和NFT有什么区别?
    MATLAB 设置纵轴显示范围、科学记数法
    java毕业生设计信息工程学院办公经费管理系统服务端计算机源码+系统+mysql+调试部署+lw
    PHP Swoole实现简易聊天室,附加小程序端连接websocket简易代码
    wsgiref模块、web框架、django框架简介
    YOLO目标检测——人脸口罩佩戴数据集【(含对应voc、coco和yolo三种格式标签】
    如何实现条件组合组件
    网络安全宣传月安全团队需要知道的关于PKI的九件事
  • 原文地址:https://blog.csdn.net/zhiai_/article/details/127644874
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号