dp算法篇Day12

news2024/11/29 4:28:34

 “我悲喜都,只换来这一场无声的野火。”


56、完全平方数

(1) 题目解析    ​​​​​​

        把题目解释到了这个份上,你很难不把思路转移到考虑 "背包问题上"。

(2) 算法原理

class Solution {
public:
    int numSquares(int n) {
        int m = sqrt(n);
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        const int INT_INFO = 0x3f3f3f3f;
        // 初始化
        dp[0][0] = 0;
        for(int j=1;j<=n;++j) dp[0][j] = INT_INFO;

        for(int i=1;i<=m;++i)
            for(int j=0;j<=n;++j)
            {
                dp[i][j] = dp[i-1][j];
                if(j >= i*i) dp[i][j] = min(dp[i][j],dp[i][j - i*i]+1);
            }
        return dp[m][n];
    }
};

优化:

class Solution {
public:
    int numSquares(int n) {
        int m = sqrt(n);
        vector<int> dp(n+1);
        const int INT_INFO = 0x3f3f3f3f;
        // 初始化
        dp[0] = 0;
        for(int j=1;j<=n;++j) dp[j] = INT_INFO;

        for(int i=1;i<=m;++i)
            for(int j=i*i;j<=n;++j) // 完全背包 从左往右
            {
                dp[j] = min(dp[j],dp[j - i*i]+1);
            }
        return dp[n];
    }
};


57、一和零

(1) 题目解析    

         唯一的不同在于,之前做的"背包问题"的条件大抵是一个,而现在的场景时两个。由此,这类问题又被称为 " 二维费用背包问题 "。

(2) 算法原理

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        int len = strs.size();
        // 三维dp
        vector<vector<vector<int>>> dp(len+1,vector<vector<int>>(m+1,vector<int>(n+1)));

        for(int i=1;i<=len;++i)
        {
            // 统计字符
            int a = 0,b=0;
            for(auto& e:strs[i-1])
            {
                if(e == '0') a++;
                else b++;
            }

            for(int j=0;j<=m;++j)
            {
                for(int k=0;k<=n;++k)
                {
                    dp[i][j][k] = dp[i-1][j][k];
                    if(j>=a && k>=b) dp[i][j][k] = max( dp[i][j][k], dp[i-1][j-a][k-b] + 1);
                }
            }
        }

        return dp[len][m][n];
    }
};

优化:

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        int len = strs.size();
        // 二维dp
        vector<vector<int>> dp(m+1,vector<int>(n+1));

        for(int i=1;i<=len;++i)
        {
            // 统计字符
            int a = 0,b=0;
            for(auto& e:strs[i-1])
            {
                if(e == '0') a++;
                else b++;
            }
            // 01背包 从右往左
            for(int j=m;j>=a;--j)
            {
                for(int k=n;k>=b;--k)
                {
                    dp[j][k] = max(dp[j][k], dp[j-a][k-b] + 1);
                }
            }
        }
        return dp[m][n];
    }
};


58、盈利计划

(1) 题目解析    

(2) 算法原理    

class Solution {
public:
    int profitableSchemes(int n, int m, vector<int>& g, vector<int>& p) {
         int len = g.size();
         vector<vector<vector<int>>> dp(len+1,vector<vector<int>>(n+1,vector<int>(m+1)));
         // 初始化 人数
         for(int j=0;j<=n;++j) dp[0][j][0] = 1;
         const int MOD = 1e9+7;
         for(int i=1;i<=len;++i)
            for(int j=0;j<=n;++j)
                for(int k=0;k<=m;++k)
                {
                    dp[i][j][k] = dp[i-1][j][k];
                    if(j>=g[i-1]) dp[i][j][k] += dp[i-1][j-g[i-1]][max(0,k-p[i-1])];
                    dp[i][j][k] %= MOD;
                }

        return dp[len][n][m];
    }
};

优化:

class Solution {
public:
    int profitableSchemes(int n, int m, vector<int>& g, vector<int>& p) {
         int len = g.size();
         vector<vector<int>> dp(n+1,vector<int>(m+1));
         // 初始化 人数
         for(int j=0;j<=n;++j) dp[j][0] = 1;
         const int MOD = 1e9+7;

         for(int i=1;i<=len;++i)
            for(int j=n;j>=g[i-1];--j) // 01背包从右往左
                for(int k=m;k>=0;--k) // k没有什么限制条件>=0即可
                {
                    dp[j][k] += dp[j-g[i-1]][max(0,k-p[i-1])];
                    dp[j][k] %= MOD;
                }

        return dp[n][m];
    }
};

 


59、组合总和Ⅳ

(1) 题目解析

         有了上面好几道题的铺垫,emm我们来看看这道题,从nums选数,这不就是类似选物品吗?再让选取的数最后等于target,这不就类似最后将背包装满嘛?可是真的是这样吗?   

        所以,本题是一道看似背包,但其实跟背包问题打不着杆的题型。

(2) 算法原理

        

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        int n = nums.size();

        vector<double> dp(target+1,0);
        dp[0] = 1;
        // 凑成i的数
        for(int i=1;i<=target;++i)
            // 枚举nums
            for(auto& e:nums)
            {
                // i >= nums[j]
                if(i >= e){
                    dp[i] += dp[i - e];
                }
            }
        return dp[target];
    }
};

 


60、不同的二叉搜索树

(1) 题目解析

         唔,节点数为n,生成的节点值是1~n,要求的是节点值构成节点数n的种树有多少。这似乎很“背包问题”。 因为又是一种选数(节点),最后构成容量(节点数)为n的过程。但,题解也能看出来,不是简单的选节点。

(2) 算法原理

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n+1);
        dp[0] = 1;

        for(int i=1;i<=n;++i)
            for(int j=1;j<=i;++j) // 枚举 0~i
                dp[i] += dp[j-1] * dp[i-j];
        
        return dp[n];
    } 
};

 


        那么本栏的dp问题也就到此结束,祝愿诸位能在算法上找到自己的解题思路和技巧。

本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python基础】VS2019中使用Python及安装Python包

【Python基础】VS2019中使用Python及安装Python包 文章目录 前言一、VS2019中安装Python环境二、Python环境变量配置三、安装Python包总结 前言 要使用Python语言来写一些程序&#xff0c;使用哪个IDE是个问题&#xff0c;若是专业开发Python&#xff0c;PyCharm无疑是最佳选择…

RTI无线电层析成像Matlab仿真数据生成

文章目录 概述初始化环境参数逆面积椭圆模型 概述 无线电层析成像是一种通过获取一定区域内多对相对固定的无线通信节点间的某种测量数据后,按照一定的数学处理方法,对区域内的障碍物目标以图像的形式 展现出来的成像技术。 开山之作&#xff1a; J. Wilson and N. Patwari, …

【小白必看】Python爬虫实战:获取阴阳师网站图片并自动保存

文章目录 前言导入模块伪装自己发送请求获取地址列表获取所有背景的地址创建文件夹保存图片文件完整代码运行效果部分图片展示结束语 前言 本文介绍了一个使用Python编写的程序&#xff0c;用于获取指定网页的背景图片并保存到本地。在程序中使用了requests模块发送HTTP请求&a…

FCPX插件-15组金色华丽粒子特效闪耀动画 Awards Backgrounds

Awards Backgrounds是fcpx上一个很棒的电影级效果插件&#xff0c;Awards Backgrounds 包含15组金色华丽粒子特效闪耀动画&#xff0c;可以为您的作品创建豪华的背景或叠加特效&#xff01;包含各种带有可编辑颜色的下落闪闪发光粒子的场景。用于展示奖项提名者、优雅的表演、祝…

【C++】开源:Redis数据库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Redis数据库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c…

Emacs之改造最快文本搜索工具ripgrep(一百一十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

微服务远程调用openFeign简单回顾(内附源码示例)

目录 一. OpenFeign简介 二. OpenFeign原理 演示使用 provider模块 消费者模块 配置全局feign日志 示例源代码: 一. OpenFeign简介 OpenFeign是SpringCloud服务调用中间件&#xff0c;可以帮助代理服务API接口。并且可以解析SpringMVC的RequestMapping注解下的接口&#x…

Android12之快速查找静态注册jni函数方法(一百六十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

C++初阶--C++入门

目录 前言C关键字命名空间命名空间的定义命名空间的使用加命名空间名称及作用域限定符使用using namespace 命名空间名称引入使用using将命名空间中的成员引入 C的输入与输出缺省参数全缺省半缺省参数 函数重载参数类型不同参数个数不同参数类型顺序不同 引用引用特性 常引用使…

可视化bi工具datart部署到k8s

目录 1. 前言 2. 安装 2.1 mysql初始化 2.2 datart配置文件持久化 2.3 文件挂载 2.4 部署 3. 登录及创建管理帐号 1. 前言 datart 是新一代数据可视化开放平台&#xff0c;支持各类企业数据可视化场景需求&#xff0c;如创建和使用报表、仪表板和大屏&#xff0c;进行可视…

Python面向对象(三)(继承、封装)

面向对象的三大特性 面向对象编程&#xff0c;是许多编程语言都支持的一种编程思想。 简单理解是&#xff1a;基于模板&#xff08;类&#xff09;去创建实体&#xff08;对象&#xff09;&#xff0c;使用对象完成功能开发。 面向对象包含3大主要特性&#xff1a; 封装 封…

ssl证书安装后还是显示不安全怎么办?解决办法来了

ssl证书安装后还是显示不安全怎么办&#xff1f;一般网站在部署安装ssl证书之后&#xff0c;浏览器的不安全显示就会消除。但有时候&#xff0c;在证书安装完成后&#xff0c;浏览器仍然会出现不安全提示&#xff0c;这时候我们可以按照以下的步骤一一排查解决。 1、确认安装的…

numpy广播机制介绍

广播 广播机制的意义&#xff1a;广播描述了在算术运算期间NumPy如何处理具有不同形状的数组。受某些约束条件的限制&#xff0c;较小的数组会在较大的数组中“广播”&#xff0c;以便它们具有兼容的形状。 在对两个数组进行操作时&#xff0c;NumPy按元素对它们的形状进行比…

UE5.1移动端PreintegratedSkinBxDF解析

Part 1 头文件 MobileBasePassPixelShader.usf 主要看Main函数&#xff1a; #if MOBILE_MULTI_VIEWResolvedView ResolveView(BasePassInterpolants.MultiViewId); #elseResolvedView ResolveView(); #endif这玩意Shader文件找不到&#xff0c;感觉是个全局变量的东西。万幸…

【JDK新特性】必会_Stream API

【必看】原创声明&#xff1a;转载请注明作者 & 文章来源&#xff1a;都在用Stream流&#xff1f; ​​​​​​​ hello&#xff0c;我是小索奇&#xff0c;这次讲解JDK 8新特性的重点&#xff01;Stream流&#xff0c;到后期学习框架时候你会发现大量的Stream流出现&…

波奇学C++:写实拷贝,_buf数组

我们知道当自定义对象如果在堆上开空间&#xff0c;那么拷贝构造时会深拷贝&#xff0c;深拷贝会加大内存开销&#xff0c;用写实拷贝(也叫延迟拷贝)可以在深浅拷贝中取得平衡。 浅拷贝问题&#xff1a; 析构两次 一个对象修改会影响另一个 用引用计数来解决析构问题 拷贝构造时…

商品库存管理系统设计与实现(Vue+SpringBoot+MySQL)

一、项目背景 当今&#xff0c;我国科技发展日新月异&#xff0c;各类企业迅速崛起&#xff0c;商品类型日益繁多&#xff0c;产品数量急剧增加&#xff0c;企业经营模式越来越多样&#xff0c;信息处理量不断加大&#xff0c;对库存管理提出了更高的要求。通过本系统&#xff…

[详细教程+渠道对接+实战陪跑社区]抖音超火小说推文新玩法

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 本人为科思创业汇&#xff0c;分享网络项目案例&#xff01; 是啊&#xff0c;公益活动又来…

白话机器学习笔记(二)学习分类

分类用图形来解释&#xff0c;把他想象为有大小有方向带箭头的向量。 设权重向量为 w w w&#xff0c;虚线为使权重向量称为法线向量的直线。 直线的表达式为&#xff1a; w ⋅ x 0 w\cdot x0 w⋅x0 (两个向量的内积) 也可写为&#xff1a; w ⋅ x ∑ i 1 n w i x i w 1…

Python(基于Pyusb)与C#(基于LibUsbDotNet)USB通信速度对比

1、实验背景 项目需求&#xff1a;下位机ZYNQ&#xff0c;需设计上位机与其通信&#xff0c;通信协议USB2.0。ZYNQ端固定Buffer长度为16k&#xff0c;即上位机向ZYNQ发送任意数据&#xff0c;ZYNQ每次反馈16k长度buffer。现对Python(基于Pyusb)与C#(基于LibUsbDotNet)的USB通信…