【刷题篇】动态规划(八)

news2024/9/29 7:24:36

文章目录

  • 1、最长定差子序列
  • 2、 最长的斐波那契子序列的长度
  • 3、最长等差数列
  • 4、等差数列划分 II - 子序列
  • 5、回文子串
  • 6、最长回文子串

1、最长定差子序列

给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。
子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。

在这里插入图片描述

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
                    //arr  dp
        unordered_map<int,int> hash;
        hash[arr[0]]=1;
        int maxi=1;
        for(int i=1;i<arr.size();i++)
        {//hash[arr[i]-difference]没有该数就直接为0+1
            hash[arr[i]]=hash[arr[i]-difference]+1;
            maxi=max(maxi,hash[arr[i]]);
        }
        return maxi;
    }
};

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

如果序列 X_1, X_2, …, X_n 满足下列条件,就说它是 斐波那契式 的:
n >= 3
对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}
给定一个严格递增的正整数数组形成序列 arr ,找到 arr 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。
(回想一下,子序列是从原序列 arr 中派生出来的,它从 arr 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列)

在这里插入图片描述

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 maxi=2;
        //i位置的最大斐波那契子序列,dp[j][i],i>j,j是i的上一个数
        vector<vector<int>> dp(n,vector<int>(n,2));
        for(int i=2;i<n;i++)//i>j
        {
            for(int j=1;j<i;j++)
            {
                int a=arr[i]-arr[j];
                if(a<arr[j]&&hash.count(a))
                {
                    dp[j][i]=dp[hash[a]][j]+1;
                }
                maxi=max(dp[j][i],maxi);
            }
        }
        return maxi<3?0:maxi;
    }
};

3、最长等差数列

给你一个整数数组 nums,返回 nums 中最长等差子序列的长度。
回想一下,nums 的子序列是一个列表 nums[i1], nums[i2], …, nums[ik] ,且 0 <= i1 < i2 < … < ik <= nums.length - 1。并且如果 seq[i+1] - seq[i]( 0 <= i < seq.length - 1) 的值都相同,那么序列 seq 是等差的。
在这里插入图片描述

class Solution {
public:
    int longestArithSeqLength(vector<int>& nums) {
        int n=nums.size();
        unordered_map<int,int> hash;
        hash[nums[0]]=0;
        vector<vector<int>> dp(n,vector<int>(n,2));
        int maxi=2;
        //这里为什么使用固定i,枚举j,原因是因为他可能会出现一样的值,abcaij,i肯定会优先找离他近的a
        for(int i=1;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                int a=nums[i]*2-nums[j];
                if(hash.count(a))
                {
                    dp[i][j]=dp[hash[a]][i]+1;
                }
                maxi=max(maxi,dp[i][j]);
            }
            hash[nums[i]]=i;//会将前面有相同的值进行覆盖
        }
        return maxi;
    }
};

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

给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目。
如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该序列为等差序列。
例如,[1, 3, 5, 7, 9]、[7, 7, 7, 7] 和 [3, -1, -5, -9] 都是等差序列。
再例如,[1, 1, 2, 5, 7] 不是等差序列。
数组中的子序列是从数组中删除一些元素(也可能不删除)得到的一个序列。
例如,[2,5,10] 是 [1,2,1,2,4,1,5,10] 的一个子序列。
题目数据保证答案是一个 32-bit 整数。

在这里插入图片描述

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,0));
        int maxi=0;
        for(int i=2;i<n;i++)
        {
            for(int j=1;j<i;j++)
            {
                long long a=(long long)nums[j]*2-nums[i];
                if(hash.count(a))
                {
                    for(auto k :hash[a])
                    {
                        if(k<j)
                            dp[j][i]+=dp[k][j]+1;
                    }
                }
                maxi+=dp[j][i];
            }
        }
        return maxi;
    }   
};

5、回文子串

给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
在这里插入图片描述

class Solution {
public:
    int countSubstrings(string s) {
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));
        int cnt=0;
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                {
                    dp[i][j]=i+1<j?dp[i+1][j-1]:true;
                    if(dp[i][j])
                        cnt++;
                }
            }
        }
        return cnt;
    }
};

6、最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
在这里插入图片描述

class Solution {
public:
    string longestPalindrome(string s) {
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));
        int len=0;
        int begin=0;
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                {
                    dp[i][j]=i+1<j?dp[i+1][j-1]:true;
                }
                if(dp[i][j]&&j-i+1>len)
                {
                    len=j-i+1;
                    begin=i;
                }
            }
        }
        return s.substr(begin,len);
    }
};

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

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

相关文章

Python爬虫中文乱码处理实例代码解析

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python爬虫中文乱码处理实例代码解析。全文2800字&#xff0c;阅读大约8分钟 在进行网络数据抓取时&#xff0c;常常会遇到中文乱码的问题&#xff0c;这可能导致数据无法正…

编程规范:长函数的思考

在工作&#xff0c;我们应该都不想看到非常的长函数。对于一个运行5年左右的项目&#xff0c;极有可能出现这种情况。由于长函数的长、if/else嵌套&#xff0c;导致代码的可读性非常差&#xff0c;这对于项目的维护和开发带来了极大的困难。所以我们应该避免写长函数&#xff0…

基于稀疏表示的小波变换多光谱图像融合算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 小波变换融合 PCA融合 基于稀疏表示的小波变换多光谱图像融合算法 性能指标对比 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........…

Redis相关的那些事(一)

背景 目前工作所负责的工作主要是投放业务&#xff0c;属于读高并发场景&#xff0c;记录一下之前碰到的redis相关的问题。 热点大值Key&缓存击穿问题 问题表现 在某次流量峰值过程中&#xff0c;redis的CPU突然飙升&#xff0c;从监控看起来就是CPU飙升到一定程度&…

微信小程序(uniapp)api讲解

Uniapp是一个基于Vue.js的跨平台开发框架&#xff0c;可以同时开发微信小程序、H5、App等多个平台的应用。下面是Uniapp常用的API讲解&#xff1a; Vue.js的API Uniapp采用了Vue.js框架&#xff0c;因此可以直接使用Vue.js的API。例如&#xff1a;v-show、v-if、v-for、comput…

基于HC-SR04传感器的避障机器人设计与实现

本文介绍了如何设计和实现一个基于HC-SR04超声波传感器的避障机器人。我们将详细讨论硬件和电路连接&#xff0c;并提供完整的Arduino代码。该机器人可以利用超声波传感器检测周围的障碍物&#xff0c;并采取相应的动作进行避障&#xff0c;实现自主导航。 引言&#xff1a; 避…

微服务架构<2>

在电商项目中&#xff0c;我们针对一些核心业务&#xff0c;比较复杂的业务需要做一些设计以及优化的过程首先我们针对于订单的模块拆分了2个子模块1.order-curr实时下单业务 2.order-his 做一些历史的订单归档我们的订单业务 >商品添加至购物车 >购物车结算--> 订单…

sklearn 逻辑回归Demo

逻辑回归案例 假设表示 基于上述情况&#xff0c;要使分类器的输出在[0,1]之间&#xff0c;可以采用假设表示的方法。 设 h θ ( x ) g ( θ T x ) h_θ (x)g(θ^T x) hθ​(x)g(θTx)&#xff0c; 其中 g ( z ) 1 ( 1 e − z ) g(z)\frac{1}{(1e^{−z} )} g(z)(1e−z)1​…

Go语言中的`sync`包同步原语

通过sync包掌握Go语言的并发 并发是现代软件开发的基本方面&#xff0c;而Go&#xff08;也称为Golang&#xff09;为并发编程提供了一套强大的工具。在Go中用于管理并发的基本包之一是sync包。在本文中&#xff0c;我们将概述sync包&#xff0c;并深入探讨其最关键的同步原语…

第二十一章博客

计算机应用实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据。编写网络应用程序前&#xff0c;首先必须明确所要使用的网络协议…

1 手写第一个Win32窗口程序

1 基础概念 什么是窗口&#xff1f; 答&#xff1a;窗口就是屏幕上的一片区域&#xff0c;接受用户的输入&#xff0c;显示程序的输出。可以包含标题栏、菜单栏、工具栏以及控件等。什么是句柄&#xff1f; 答&#xff1a; 作为一种管理和操作系统资源的机制&#xff0c;提供了…

【AI提示词故事】雪的诗意:静谧与活力的奇妙交织

雪的诗意&#xff1a;沉浸在雪景的浪漫氛围中 冬日的清晨&#xff0c;窗外的世界被一层洁白的雪覆盖着&#xff0c;仿佛是大自然为我们准备的一幅美丽画卷。 我走出房门&#xff0c;踏上雪地&#xff0c; 那柔软的雪粒在脚下发出轻柔的咯吱声&#xff0c;仿佛是在诉说着冬日的…

SQL进阶:子查询

一般情况下,我们都是直接对表进行查询,但有时候,想要的数据可能通过一次select 获取不到,需要嵌套select,这样就形成了子查询。 子查询可以位于查询语句的任意位置,主要的注意点在于用于不同的位置,和不同的关键字一起使用时,需要注意返回的列的数量和行的数量。 位于…

Kubernetes(K8S)快速入门

概述 在本门课程中&#xff0c;我们将会学习K8S一些非常重要和核心概念&#xff0c;已经操作这些核心概念对应组件的相关命令和方式。比如Deploy部署&#xff0c;Pod容器&#xff0c;调度器&#xff0c;Service服务&#xff0c;Node集群节点&#xff0c;Helm包管理器等等。 在…

第十四章 集合(List)

一、集合框架体系 集合&#xff1a; &#xff08;1&#xff09;可以动态保存任意多个对象。 &#xff08;2&#xff09;提供了一系列方便的操作对象的方法&#xff1a;add、remove、set、get等。 二、Collection 1. Collection 接口常用方法 &#xff08;1&#xff09;add&a…

华为OD机试 - 多段线数据压缩(Java JS Python C)

在线OJ刷题 题目详情 - 多段线数据压缩 - Hydro 题目描述 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多线段的走向只能是水平、竖直、斜向45度。 上图中的多线段可以用下面的坐标串表示:(2,8),(3,7),(3,6),(3,5),(4,4),(5,3),(6,2),(7,3),(…

C语言中常见的笔试题(二)

题目一&#xff1a; 问题&#xff1a; 在C语言中&#xff0c;const关键字有哪些用途&#xff1f;请列举出至少三种用途&#xff0c;并给出相应的代码示例。 答案&#xff1a; 定义常量&#xff1a;使用const关键字可以定义常量&#xff0c;它们的值在程序运行期间不能被修改…

React 路由跳转

1. push 与 replace 模式 默认情况下&#xff0c;开启的是 push 模式&#xff0c;也就是说&#xff0c;每次点击跳转&#xff0c;都会向栈中压入一个新的地址&#xff0c;在点击返回时&#xff0c;可以返回到上一个打开的地址&#xff0c; 就像上图一样&#xff0c;我们每次返…

U4_2 语法分析-自底向上分析-算符优先分析

文章目录 一、回顾1、推导 vs 规约2、句型、短语、简单短语、句柄 二、自底向上&#xff08;移进-规约&#xff09;分析方法1、基本思想2、分析过程3、移进—归约分析&#xff08;Shift-Reduce Parsing) 三、算符优先分析1、概念2、分析流程1&#xff09;先确定终结符之间的优先…

Codeforces Round 917 (Div. 2)(A~D)(又是数学题)

A - Least Product 题意&#xff1a; 思路&#xff1a;若有奇数个负数&#xff0c;则不需要任何操作。若存在0&#xff0c;也不需要任何操作。其余情况将任意一个数改为0即可。 #include <bits/stdc.h> using namespace std; void solve() {int n;cin >> n;int …