【动态规划】子序列问题二(数组中不连续的一段)

news2024/11/26 10:45:49

子序列问题二

  • 1.最长定差子序列
  • 2.最长的斐波那契子序列的长度
  • 3.最长等差数列
  • 4.等差数列划分 II - 子序列

在这里插入图片描述

点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃

1.最长定差子序列

题目链接: 1218. 最长定差子序列

题目分析:

在这里插入图片描述
给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。

算法原理:

1.状态表示

经验 + 题目要求

dp[i] 表示:以 i 位置的元素为结尾的所有子序列中,最长的等差子序列的长度

2.状态转移方程

设 i 位置里面元素为a,如果以 i 位置元素为结尾研究最长等差子序列的长度,其实 i 位置前面那个元素已经确定了,这道题和最长递增子序列是有区别的,那道题 i 位置前面的元素是要从前往后遍历一遍的来找倒数第二个元素在哪里。这道题已经告诉我们相邻两个元素的差是diff,我只要知道最后一个元素就能推出倒数第二个元素。设倒数第二个元素为b。 a - b = diff —> b = diff - a。

根据 b 存不存在可以分两个情况:

b不存在,a本身就是

b存在,因为是乱序的,前面可能有很多元素等于b,其实我们只需要考虑最后一个b元素的位置就可以了。因为我们想要的是以b元素为结尾的最长等差子序列的长度,最后一个b元素所在位置dp[j1]里面的值至少大于等于前面以b元素为结尾最长等差子序列的长度。然后加上 i 位置的元素。

在这里插入图片描述

这里有个优化:

虽然我们是可以从后往前遍历找到最后一个b元素所在的位置的,但是我们可以这也做,可以之间把 b 元素 和它对应的 dp[i] 放在hash表。就不用去遍历了,可以O(1)的时间复杂度就找到。

  1. 将 元素 + dp[j] 的值,绑定放进哈希表中

甚至我们还可以将 a 元素 + dp[i] 绑定放进哈希表。这样的话就不用要哈希表了。

  1. 直接在哈希表中,做动态规划

3.初始化

我们只需要将以第0个位置元素为结尾子序列,最长的等差子序列的长度初始化一下就行了,反正没得选,就是自己本身。

dp[arr[0]] = 1

4.填表顺序

从左往右

5.返回值

我们要返回的是最长的等差子序列长度,但是这个长度可能在dp表里任意一个位置,因此返回 dp 表里面的最大值

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {

        // 创建 dp 表
        unordered_map<int,int> hash; //arr[i] - dp[i]
        // 初始化
        hash[arr[0]] = 1;
        //填表
        int ret = 1;
        for(int i = 1; i < arr.size(); ++i)
        {
            //hash[arr[i]]保证b是最新的值
            //hash[arr[i] - difference]保证如果不存在value是0
            hash[arr[i]] = hash[arr[i] - difference] + 1;
            ret = max(ret,hash[arr[i]]);
        }
        return ret;

    }
};

2.最长的斐波那契子序列的长度

题目链接: 873. 最长的斐波那契子序列的长度

题目分析:

在这里插入图片描述

满足斐波那契数列条件,元素长度大于等于3,还有从第三个元素开始,每个元素都等于前两个元素的和,如果序列满足这两个条件我们就称之为斐波那契数列。

在这里插入图片描述
注意这道题给的是严格递增,不仅是递增的而且元素还是不重复的。填表的时候有优化的作用。

算法原理:

1.状态表示

经验 + 题目要求

dp[i] 表示:以 i 位置元素为结尾所有子序列中,最长斐波那契数列子序列的长度

我们尝试用这个状态表示来看看能不能推导出来状态转移方程。

我们是 i 位置来划分问题的,在 0 ~ i -1 任选一个位置 j ,通过 j 位置的 dp[j] ,来更新出 i 位置的dp[i],这是之前做子序列的方法。但是这道题就不行了。我们的状态表示只是表示出来最长斐波那契数列子序列的长度,但是并不知道具体的斐波那契序列。其实如果我们知道最后两个位置的值nums[j],nums[i],我们是能推导出来在前面一个位置的。但是dp[j]根本不知道这个斐波那契数列是什么样。所有我们不能直接用dp[j]的值去更新dp[i]的值。所以上面的状态表示不对!

在这里插入图片描述

通过刚才的分析我们发现,如果在一个斐波那契数列知道最后两个元素,其实是可以把前面所有的元素都推出来的。 … a-(b-a),b-a,b,a。既然单独一个位置为结尾推不出来斐波那契子序列长什么样子,但是如果能用两个元素为结尾就能推出斐波那契子序列长什么样子。一维解决不了问题,在扩一维。

dp[i][j] 表示: 以 i 位置以及 j 位置的元素为结尾的所有子序列中,最长斐波那契子序列长度。 (i 位置 < j 位置)

在这里插入图片描述

2.状态转移方程

如果我们以最后两个位置为结尾,其实我们是可以直接知道倒数第三个数,设倒数第三个数为 a, a = c - b,设 a 的下标为 k

在这里插入图片描述

根据a可以分下面三种情况:

  1. a不存在
  2. a存在且b<a<c
  3. a存在且a<b

a不存在,根本构不成斐波那契子序列,dp[i][j]本应该是0的,但是dp[i][j] 表示以 i,j位置为结尾,至少有两个元素。所以给2。如果dp里面都是2说明,没有都没有构成斐波那契子序列,最后直接返回0就可以了。

a存在且b<a<c,a虽然存在,但是在bc中间,不符合斐波那契数列,所以也是给2。

a存在且a<b,我们要的是最长斐波那契子序列长度,先把 k 位置元素拿出来,,在把 i 位置元素拿出来,先找到以着两个位置元素为结尾的最长斐波那契子序列,后面在加上一个j位置元素就可以了。 而以ki位置元素为结尾最长斐波那契子序列正好在dp[k][j]中,然后再加上1

在这里插入图片描述

优化:找a元素所在位置比较花时间,因此我们将数组中所有元素与它们的下标绑定,存在哈希表中。(数组里面的元素是严格递增,不会存在重复元素)

3.初始化

表里面所有的值都初始化为2,就不用考虑前面两种情况了。
但是细心的会发现不能把表里面的值都初始化为2,dp[0][0] 相当于里面就一个元素,里面的值就是1。其实我们在状态表示就已经规定好了 i < j。对于这个二维dp表,我们只会用到上半部分,

在这里插入图片描述

4.填表顺序

从上到下,从左到右

5.返回值

dp表里面的最大值 ret , ret < 3 ? 0 : ret

class Solution {
public:
    int lenLongestFibSubseq(vector<int>& arr) {

       int n = arr.size();
       //优化
       unordered_map<int,int> hash;
       for(int i = 0; i < n; ++i)
            hash[arr[i]] = i;
        
        int ret = 2;
        vector<vector<int>> dp(n,vector<int>(n,2));
        for(int j = 2; j < n; ++j)// 固定最后⼀个位置
        {
            for(int i = 1; i < j; ++i) // 固定倒数第⼆个位置
            {
                int a = arr[j] - arr[i];
                // 条件成⽴的情况下更新 
                if(a < arr[i] && hash.count(a))
                    dp[i][j] = dp[hash[a]][i] + 1;
                ret = max(ret,dp[i][j]);// 统计表中的最⼤值
            }
        }

        return ret < 3 ? 0 : ret;
    }
};

3.最长等差数列

题目链接: 1027. 最长等差数列

题目分析:

在这里插入图片描述

在数组中找一个子序列,这个子序列要是最长的等差子序列,返回长度。

算法原理:

1.状态表示

经验 + 题目要求

dp[i] 表示:以 i 位置元素为结尾的所有子序列中,最长的等差序列的长度。

接下来以这个状态表示分析一下:能推导出来状态转移方程说明这个状态表示是对的,推导不出来说明这个状态表示是错的。

我想求 以 i 位置元素为结尾的 dp[i] 的值,根据以往的经验 要去 0 ~ i - 1 位置找dp[j]去更新dp[i],但是这道题不行,这道题要找的是 最长的等差序列的长度。而dp[i-1]表示以 i -1 位置元素为结尾的所有子序列中,最长的等差序列的长度。我只知道长度,并不知道等差子序列是什么,这个 i 到底能不能跟在 j 后面是不知道的!因此上面状态表示不对。

如果我们知道等差序列最后两个元素,我们就知道把这个等差序列前面所有元素都推出来,设倒数第一个位置是 a ,倒数第二个位置是 b, 倒数第三个位置为 x,x = 2*a-b。

因此我们的状态表示:

dp[i][j] 表示:以 i 位置以及 j 位置的元素为结尾的所有子序列中,最长的等差序列的长度(i < j)。

2.状态转移方程

设倒数第二个位置 i 位置元素为 b,倒数第一个位置 j 位置元素为 a,我们可以推出来倒数第三个位置 k 位置元素为 a = 2b -c

根据倒数第三个 k 位置可以分为三种情况:

  1. a不存在
  2. a存在,i < k < j
  3. a存在,k < i

a不存在以及a存在,i < k < j(a在bc中间),单独bc就能构成等差子序列,因此长度为2

在这里插入图片描述

a存在,k < i(a < b,在i 位置左边),但是这里又有很多种情况这个a可能有很多个。那这个时候我们需要把所有情况都考虑吗。其实不需要,假设前面最长子序列是以a元素为结尾,那最后一个a所在位置的长度至少大于等于前面的a的长度。所有我们只考虑离 i 位置最近的a就可以了。我们的 k 也表示的是左边离 i 位置最近的那个下标。

在这里插入图片描述

dp[i][j] 表示以 ij 为结尾的最长子序列的长度,这个时候如果发现倒数第三个元素存在并且i左边,是不是可以先找到以 ki 为结尾的最长的长度,然后加一个 j 位置元素就行了,而以 ki 为结尾的最长的长度正好就是 dp[k][i]

在这里插入图片描述

还没完,有没有发现我们找下标k并不是O(1)的时间复杂度。本来dp[i][j] 时间复杂度就已经是O(N ^ 2),又来了一层循环,时间复杂度就变成 O(N ^ 3)。

优化一下:我们要找到的是离 i 位置最近a元素的下标

  1. 在 dp 之前将所有元素 + 下标绑定,放在hash表中,<元素,下标数组>(适合数组中无重复元素)。但是如果这个数据非常恶心,它会把下标数组搞得非常大,时间复杂度依旧是O(N ^ 3)。
    2.一边 dp,一边保存离它最近的元素的下标,<元素,下标>(适合数组中有重复元素)。 这样就是O(1)时间复杂度。

选第二种方式写代码有技巧和填表顺序有关,我们先分析下面的。

3.初始化

表里面所有的值都初始化为2,就不用考虑前面两种情况了。
但是细心的会发现不能把表里面的值都初始化为2,dp[0][0] 相当于里面就一个元素,里面的值就是1。其实我们在状态表示就已经规定好了 i < j。对于这个二维dp表,我们只会用到上半部分,

在这里插入图片描述

4.填表顺序

我们是以i j 位置为结尾,填表也有两种方法:

第一种:

  1. 先固定倒数第一个数
  2. 枚举倒数第二个数

先固定最后一个数 j,枚举倒数第二个数也就是说 i 位置是从0 开始到 j - 1 。当 i = 0 算一下 dp[i][j],当 i = 1 算一下 dp[i][j] 。。。

在这里插入图片描述

第二种:

  1. 先固定倒数第二个数
  2. 枚举倒数第一个数

先固定 i,让 j 从 i + 1 位置开始往后枚举。

在这里插入图片描述

那我们选哪种策略呢?回到优化,一边 dp,一边保存离它最近的元素的下标,<元素,下标>(适合数组中有重复元素)。 如果选择第一种策略会有一种问题,i 位置是一直移动的,那最近的元素也是在一直改变。很难保证是最近的。 所以我们选择第二种初始化方式。当我们固定 i 位置之后,j是往后移动的。当把 i 位置填完之后,ij都会往后移动,我们就可以把i位置的元素存到hash表里。

所以我们选择第二种填表顺序,当 i 位置填完之后,将 i 位置的值放入到hash表中即可。

5.返回值

dp[i][j] 表示以 ij 为结尾的最长子序列的长度,题目要求的是整个子序列中最长的那个。所以返回 dp 表中的最大值。

class Solution {
public:
    int longestArithSeqLength(vector<int>& nums) {
        
        //优化
        unordered_map<int,int> hash;
        hash[nums[0]] = 0;

        int n = nums.size();
        vector<vector<int>> dp(n,vector<int>(n,2));//创建 dp 表 + 初始化
        int ret = 2;
        for(int i = 1; i < n - 1; ++i)//固定倒数第二个数
        {
            for(int j = i + 1; j < n; ++j)//枚举倒数第一个数
            {
                int a = 2 * nums[i] - nums[j];
                if(hash.count(a))
                {
                    dp[i][j] = dp[hash[a]][i] + 1;
                    ret = max(ret,dp[i][j]);
                }
            }
            hash[nums[i]] = i;
        }
        return ret;

    }
};

4.等差数列划分 II - 子序列

题目链接: 446. 等差数列划分 II - 子序列

题目分析:

在这里插入图片描述

给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目。

如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该序列为等差序列。

算法原理:

1.状态表示

经验 + 题目要求

dp[i] 表示 :以 i 位置元素为结尾的所有子序列中,等差子序列的个数

接下来就以这个状态表示看看能不能分析出状态转移方程

以 i 位置元素为结尾的子序列,根据前面的经验 ,有可能是自己本身,有可能是前面 0 ~ i - 1 区间 dp[i - 1],dp[i - 2] … dp[0] 去更新dp[i]进而得到状态转移方程。dp[i - 1] 对应 i - 1 位置元素,dp[i - 2] 对应 i - 2 位置元素… 。,这道题我们要的是等差子序列,要的是 i 位置跟在这些元素的后面,我们的状态表示只是等差子序列的个数,i 位置跟在前面元素后面形成等差子序列,必须要是能跟才行。这个状态表示,我们只知道子序列的个数,但是不能确定一个具体的子序列。 因此这个状态表示不对。重新定义一个状态表示。我们如果等差子序列最后两个位置元素就可以把整个等差子序列推出来了。因此状态表示可以这样定义

dp[i][j] 表示:以 i 位置的元素以及 j 位置的元素为结尾的所有子序列中,等差子序列的个数(i < j)。

2.状态转移方程

设倒数第二个位置 i 位置元素为b,倒数第一个位置 j 位置元素为 c,倒数第三个位置 k位置 元素为a , a = 2b - c

根据 a 可以分三种情况:

  1. a不存在
  2. a存在,i < k < j
  3. a存在,k < i

a不存在,a存在,i < k < j 构不成等差子序列,给0就行了

a存在,k < i,但是这里又有很多种情况这个a可能有很多个。是全都都考虑还是只考虑最后一个位置的a呢?注意我们这里要的是等差子序列的个数,并不是最长等差子序列长度等等。bc可以和前面任意一个a构成等差子序列,因此我们都要考虑。

dp[i][j] 表示以 ij 为结尾的等差子序列的个数,这个时候如果发现倒数第三个元素存在并且i左边,是不是可以先找到以 ki 为结尾的等差子序列个数,然后加一个 j 位置元素就行了,而以 kx i 为结尾的等差子序列个数正好就是 dp[kx][i]然后在加上 j 位置,注意这里求的是个数,因此 dp[i][j] += dp[ki][i] + 1

在这里插入图片描述

这里有个优化:a可能是由重复的,dp[i][j]时间复杂度是O(N ^ 2),如果在遍历去找a时间复杂度就是O(N ^ 3)了,因此

在dp之前,将<元素,下标数组>绑定在一起,放在哈希表中。

3.初始化

最差情况下就是 i j 位置元素为结尾不构成等差子序列,所以可以把dp表里面所有的值都初始化为0

4.填表顺序

  1. 固定倒数第一个数
  2. 枚举倒数第二个数

5.返回值

要的是等差子序列的个数,因此返回 dp 表里面所有元素的和。

class Solution {
public:
    int numberOfArithmeticSlices(vector<int>& nums) {
        int n = nums.size();
        //优化
        unordered_map<long long,vector<int>> hash;
        for(int i = 0; i < n; ++i)
            hash[nums[i]].push_back(i);

        vector<vector<int>> dp(n,vector<int>(n));//创建 dp 表 + 初始化
        int ret = 0;
        for(int j = 2; j < n; ++j)// 固定倒数第⼀个数
        {
            for(int i = 1; i < j; ++i)// 枚举倒数第⼆个数
            {
                long long a = (long long)2 * nums[i] - nums[j];//处理数据溢出
                if(hash.count(a))
                {
                    for(auto k : hash[a])
                    {
                        if(k < i)
                            dp[i][j] += dp[k][i] + 1;
                        else
                            break;

                    }
                    ret += dp[i][j];
                }
            }
        }
        return ret;
        

    }
};

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

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

相关文章

易基因:Adv Sci:ACE等揭示产前不良环境暴露通过DNA羟甲基化变化介导子代自闭症|国人佳作

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 自闭症谱系障碍&#xff08;Autism spectrum disorder&#xff0c;ASD&#xff09;是一种神经发育障碍&#xff0c;以社交沟通障碍和刻板行为为主要特征。许多研究证明&#xff0c;妊娠期…

2024上半年上汽收入2770多亿,为啥没长城900多亿赚得多?

【科技明说 &#xff5c; 车评头条】 看了上汽集团和长城汽车两家的最新H1财报后&#xff0c;你是不是发现了点什么&#xff1f; 上汽集团披露2024年半年报。公司上半年实现合并营业收入2770.86亿元&#xff0c;同比下降12.43%&#xff1b;净利润66.28亿元&#xff0c;同比下…

vb.net发送邮件:如何高效地实现邮件发送?

vb.net发送邮件怎么配置服务器&#xff1f;怎么用vb.net发邮件&#xff1f; 如何高效地实现vb.net发送邮件&#xff0c;确保邮件能够快速、稳定地送达&#xff0c;是许多开发者面临的挑战。AokSend将深入探讨vb.net发送邮件的最佳实践&#xff0c;帮助您提升邮件发送的效率和可…

投屏开发调试技能-pcm数据转wav格式文件源码实战分享

背景 在学习投屏相关音视频开发时候&#xff0c;经常验证一些声音卡顿问题时候&#xff0c;需要对音频数据可能需要保存到本地&#xff0c;一般可能是pcm格式的数据&#xff0c;但是pcm格式的数据是不可以用音乐播放器直接进行播放&#xff0c;需要专门的工具&#xff0c;而且…

14种实际上有效的AI营销方法(专业推荐)

当有人提到人工智能时&#xff0c;你会感到头晕目眩吗&#xff1f;这是可以理解的。LinkedIn和Twitter&#xff08;好吧……现在叫X&#xff09;充斥着刚刚涌现的AI专家和科技达人们&#xff0c;他们在分享最新的27步算法攻略和自动化整个市场营销程序的操作。 这对大多数基层…

一款rust语言AI神器cursor在ubuntu环境下的安装启动教程

虽然cursor目前只支持英文但是它强大的代码联想能力以及问答能力&#xff0c;可以高效的提高编码效率。 如下步骤所有的前提是你的ubuntu上面已经安装了rust以及其必须的extensions。 1 下载 到官网https://www.cursor.com下载指定版本的软件。 下载到本地以后会生成如下软件…

如何通过网络找到自己想要的LabVIEW知识?

学习LabVIEW或其他编程技术时&#xff0c;无法依赖某一篇文章解决所有问题。重要的是通过多种途径获取灵感&#xff0c;并学会归纳总结&#xff0c;从而逐渐形成系统性的理解。这种持续学习和总结的过程是技术提升的基础。通过网络找到所需的LabVIEW知识可以通过以下几个步骤进…

WEB渗透权限维持篇-MSSQL后门

往期文章WEB渗透权限维持篇-DLL注入\劫持-CSDN博客 WEB渗透权限维持篇-CLR-Injection-CSDN博客 WEB渗透权限维持篇-计划任务-CSDN博客 WEB渗透权限维持篇-DLL注入-修改内存中的PE头-CSDN博客 WEB渗透权限维持篇-DLL注入-进程挖空(MitreT1055.012)-CSDN博客 WEB渗透权限维…

轻松上手LangChain:新手必读的入门指南

导语 在人工智能领域的不断发展中&#xff0c;语言模型扮演着重要的角色。特别是大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT&#xff0c;已经成为科技领域的热门话题&#xff0c;并受到广泛认可。在这个背景下&#xff0c;LangChain作为一个以LLM模型为核…

打造高效业务架构:价值流在企业转型中的应用指南

从流程到价值流的业务架构转型 随着企业面对数字化转型带来的激烈市场竞争&#xff0c;优化业务架构成为每个企业管理者必须面对的核心挑战。传统的业务流程优化方法往往难以应对复杂的客户需求和日益增加的业务复杂性。《价值流指南》由The Open Group发布的企业数字化转型专…

K-Means算法详解与实战应用.

在数据分析的众多工具中&#xff0c;K-Means聚类算法以其简单、直观和高效的特点&#xff0c;成为了探索数据集结构的常用方法。本文将带你深入了解K-Means算法的原理&#xff0c;并展示如何在实际项目中运用这一强大的聚类工具。 一 算法原理 K-Means是一种迭代聚类算法&…

共享旅游卡,客户旅游云南,真实反馈,全程无删减!

​这是团队伙伴袁总的客户&#xff0c;也是袁总的朋友&#xff0c;使用千益畅行旅游卡&#xff0c;亲身带家人去旅游云南后体验反馈。 从抗拒旅游卡&#xff0c;报付费团旅游&#xff0c;到了解旅游卡&#xff0c;使用旅游卡去体验&#xff0c;中途的担忧顾虑&#xff0c;到结…

计算机网络(五) —— 自定义协议简单网络程序

目录 一&#xff0c;关于“协议” 1.1 结构化数据 1.2 序列化和反序列化 二&#xff0c;网络版计算器实现准备 2.1 套用旧头文件 2.2 封装sock API 三&#xff0c;自定义协议 3.1 关于自定义协议 3.2 实现序列化和反序列化 3.3 测试 三&#xff0c;服务器实现 3.1…

【C++ 面试题】构造函数和析构函数你了解多少呢?

文章目录 1. 什么是构造函数和析构函数2. 构造函数和析构函数可以是虚函数吗3. 构造函数有哪几种4. 深拷贝和浅拷贝的区别 1. 什么是构造函数和析构函数 &#x1f427; 构造函数&#xff1a; 构造函数是在创建对象时自动调用的特殊成员函数。 目的&#xff1a;初始化对象的成…

【Redis】主从复制 - 源码

因为主从复制的过程很复杂, 同时核心逻辑主要集中在 replication.c 这个文件中, 避免篇幅过大, 所以将主从复制中涉及这个文件的代码集中到了另一篇文章。 在当前文章主要分析主从复制的大体代码逻辑, 如果需要了解整体的过程, 可以配合 Redis 主从复制 - relication 源码分析 …

中非合作打开非洲14亿人的市场新空间,非洲电商平台有哪些?

中非合作论坛自2000年成立以来&#xff0c;中非贸易额从105亿美元增至2821亿美元&#xff0c;增长近26倍。中国对非投资也从4亿多美元增长至400多亿美元&#xff0c;增幅超过100倍。此次中非合作论坛开幕式上&#xff0c;中国更是宣布未来将为非洲提供约500亿美元的融资&#x…

水库大坝安全监测方案,双重守护,安全无忧

水库作为重要的水利设施&#xff0c;在防洪、灌溉及供水等方面发挥着重要作用。然而随着时间的推移&#xff0c;大坝面临着自然老化、设计标准不足及极端天气等多重挑战&#xff0c;其安全性与稳定性日益受到关注。水库堤坝险情导致的洪涝灾害给人民生命财产和经济社会发展带来…

运动耳机选哪种好用?六条绝妙选购要点避免踩坑

​开放式耳机目前非常流行&#xff0c;它们的设计不侵入耳道&#xff0c;长时间佩戴也不会感到不适&#xff0c;同时还能维护耳部卫生&#xff0c;这使得它们特别受到运动爱好者和耳机发烧友的喜爱。然而&#xff0c;市场上的开放式耳机品牌众多&#xff0c;质量参差不齐&#…

乡村振兴/乡村风貌 乡村建设改造方案设计

[若愚文化STUDIO] 乡村振兴/乡村建设/风貌改造/产业策划 深度参与GD省“百千万”工程&#xff0c; 助力乡村建设。 根据现状实景&#xff0c;充分保留主体建筑物&#xff0c;快速出改造意向图。

vue的学习之路(Vue中组件(component )

注意&#xff1a;其中添加div的意义就是让template标签有一个根标签 &#xff0c;否则只展示“欢迎进入登录程序” 不加div效果图 &#xff08;2&#xff09;两种开发方式 第一种开发方式 //局部组件登录模板声明 let login { //具体局部组件名称 template:‘ 用户登录 ’…