算法记录 | Day57 动态规划

news2024/9/20 22:26:46

647.回文子串

思路:

1.确定dp数组(dp table)以及下标的含义:

布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。

2.递推公式:

  • if (s[i]!=s[j])

    • dp[i][j] =False ;
  • if (s[i]== s[j])

    • i==j,同一个字符例如a,当然是回文子串
    • abs(i-j)=1,例如aa,也是回文子串
    • abs(i-j)>1,例如cabac,此时s[i]与s[j]已经相同了,看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。

3.初始化:dp[i][j]初始化为false

4.确定遍历顺序

首先从递推公式中可以看出,情况三是根据dp[i + 1][j - 1]是否为true,在对dp[i][j]进行赋值true的。

dp[i + 1][j - 1] dp[i][j]的左下角,如图:

要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的

!5.举例推导dp数组

举例,输入:“aaa”,dp[i][j]状态如下:

647.回文子串1

图中有6个true,所以就是有6个回文子串。

注意因为dp[i][j]的定义,所以j一定是大于等于i的,那么在填充dp[i][j]的时候一定是只填充右上半部分。](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171032473-20230310132134822.jpg)

class Solution:
    def countSubstrings(self, s: str) -> int:
        size = len(s)
        if size <= 1:
            return size

        dp =[[False]*size for _ in range(size)]
        result = 0
        for i in range(size+1,-1,-1):
            for j in range(i,size):
                if s[i] == s[j]:
                    if (j-i) <= 1:
                        dp[i][j] = True
                        result += 1
                    elif(dp[i+1][j-1]):
                        dp[i][j] = True
                        result += 1
        return result

516.最长回文子序列

思路:

1.确定dp数组(dp table)以及下标的含义

dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]

2.确定递推公式

  • if(s[i]==s[j]),dp[i][j] = dp[i + 1][j - 1] + 2516.最长回文子序列
  • if(s[i]!=s[j]),dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
    • 加入s[j]的回文子序列长度为dp[i + 1][j]
    • 加入s[i]的回文子序列长度为dp[i][j - 1]516.最长回文子序列1

3.初始化:当i与j相同,那么dp[i][j]一定是等于1的,即:一个字符的回文子序列长度就是1。

4.确定遍历顺序

从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1],dp[i + 1][j] dp[i][j - 1],如图:

img

所以遍历i的时候一定要从下到上遍历,这样才能保证下一行的数据是经过计算的

5.举例推导dp数组

输入s:“cbbd” 为例,dp数组状态如图:红色框即:dp[0][-1]为最终结果。

516.最长回文子序列3

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        size = len(s)
        if size <= 1:
            return size

        dp = [[0]*size for _ in range(size)]

        for i in range(size):
            dp[i][i] = 1
        
        for i in range(size-1,-1,-1):
            for j in range(i+1, size):
                if (s[i]==s[j]):
                    dp[i][j] = dp[i+1][j-1] + 2
                else:
                    dp[i][j] = max(dp[i+1][j],dp[i][j-1])
        return dp[0][-1]

动态规划总结

动规五部曲分别为:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【前端】实际开发案例

文章目录 1. 侧边栏2. 调查报告3. 显示隐藏遮罩案列4. 鼠标经过&#xff0c;图片放大5. 奔跑的熊6. 旋转木马7. 百度换肤8. tab栏切换9. 下拉菜单10. 发布留言11. 动态生成表格12. 图片跟随鼠标移动13. 按键输入内容14. 定时器实现15. 发送短信16. 5秒后跳转页面17. 获取URL参数…

Ajax + axios + 常用状态码(笔记)

Ajax 求关注&#x1f62d; 一、客户端与服务器相关的概念 1.1 客户端与服务器 1.1.1 服务器 服务器&#xff1a; 负责 存放 和 对外提供 资源 的 电脑本质&#xff1a; 就是一台电脑&#xff0c;只不过 性能 要比别的电脑 高 1.1.2 客户端 客户端&#xff1a; 在上网过程…

【HttpRunner3】一分钟生成测试用例

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍HttpRunner概念、设计思想和理念、环境搭建、一分钟生成测试用例和脚手架快速创建。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上…

成都爱尔李晓峰主任:眼睛干到发出求救信号,快注意!

眼睛总感觉痒痒的&#xff0c;时不时干涩、酸胀、畏光? 它在提醒你&#xff0c;它太干了救救它! 干眼如何判断&#xff1f; 干眼症是由于泪液的质和量异常或者泪液的流体动力学障碍而导致眼表无法保持湿润的一种眼病。会发生眼睛干涩、酸胀、畏光、灼热感、异物感、看东西容易…

Packet Tracer 模拟配置AAA认证

Packet Tracer 模拟配置AAA认证 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 F0/0 172.16.10.1 255.255.255.0 不适用 S0/3/0 10.1.1.1 255.255.255.0 不适用 F0/1 192.168.1.1 255.255.255.0 不适用 R2 F0/0 192.168.2.1 255.255.255.0 …

【云原生】--- Kubernetes原理

Kubernetes原理 一、Kubernets是什么&#xff1f;1、K8s由来2、K8S的作用 二、为什么需要Kubernetes&#xff0c;它能做什么&#xff1f;三、Kubernetes的特性四、Kubernetes架构1、Kubernetes工作流程2、创建pod流程 一、Kubernets是什么&#xff1f; Kubernetes的缩写为&…

Aztec 征求 Rollup Sequencer去中心化提案

1. 引言 前序博客&#xff1a; Rollup去中心化Rollup Decentralization Aztec Rollup中Sequencer角色的主要职责为&#xff1a; 1&#xff09;从mempool中选取pending交易2&#xff09;将选中的pending交易排序打包到L2区块中3&#xff09;验证所有private交易proof以检查其…

(c语言1)阶乘求和

输入格式 求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n不超过20)。 输入格式 n 输出格式 Sn的值 样例输入 5 样例输出 153 题解 然后直接先上题解 #include<stdio.h> int main() {int n,a1;long long sum0,m1; //为这是阶乘求和&#xff0c;一般的i…

第五十三章 Unity 移动平台输入(上)

在移动设备上&#xff0c;Input 类提供对触摸屏、加速度计和地理/位置输入的访问。这里我们简单介绍Input类对于触摸屏的支持。Input.Touches是一个触摸数组&#xff0c;每个数组元素代表着手指在屏幕上的触碰状态Input.Touch。Input.Touch 数据结构表示&#xff1a; fingerId…

带你了解新兴安全技术

随着科技的不断发展&#xff0c;生物识别技术已经成为了一种重要的安全技术。生物识别技术可以通过对个人身份的验证和认证来防止身份盗窃和其他形式的安全威胁&#xff0c;因此越来越多的组织和企业开始使用这种技术来提高安全性。随着科技的不断发展&#xff0c;生物识别技术…

CTFHub-Git泄露-Log

前言 git是一个版本控制工具&#xff0c;通过泄露的.git文件可还原代码 题目如下 wp 1. dirsearch目录扫描 发现存在git泄露&#xff0c;根据提示下载对应git利用工具GitHack&#xff0c;这个工具的特点是能还原历史版本 2. 使用工具下载源码 tips: 最好在linux中操作&…

springboot社区物业管理系统

分享一个springboot社区物业管理系统&#xff0c;需要的私信 项目简介 本系统涉及到的技术主要如下 推荐环境配置&#xff1a;eclipse/idea jdk1.8 maven mysq 前端技术&#xff1a;Layui&#xff0c;Ajax&#xff0c;Json 后端技术&#xff1a;SpringBoot 2.3.0&#xff0c;…

day4-字符设备驱动基础上_基础框架

大纲&#xff1a; 设备分类 申请和注销设备号 函数指针复习 注册字符设备 字符设备驱动框架解析 读操作实现 写操作实现 ioctl操作实现 printk 多个次设备的支持 一、Linux内核对设备的分类 linux的文件种类&#xff1a; -&#xff1a;普通文件 (文件内容、文件名、…

HashMap 的 7 种遍历方式与性能分析

随着 JDK 1.8 Streams API 的发布&#xff0c;使得 HashMap 拥有了更多的遍历的方式&#xff0c;但应该选择那种遍历方式&#xff1f;反而成了一个问题。 本文先从 HashMap 的遍历方法讲起&#xff0c;然后再从性能、原理以及安全性等方面&#xff0c;来分析 HashMap 各种遍历…

C++实践模拟(vector list,反向迭代器)

vector与list的模拟实现&#xff0c;主要是在实现过程中体会模板在编程中的应用&#xff0c;了解C中迭代器的底层实现机制&#xff0c;因此笔者会将重点内容放在模板应用&#xff0c;迭代器底层实现&#xff0c;反向迭代器&#xff0c;迭代器失效等方面&#xff0c;至于其他的增…

Webpack5构建性能优化:构建耗时从150s到60s再到10s | 京东云技术团队

作者&#xff1a;京东科技 牛志伟 近期对Webpack5构建性能进行了优化&#xff0c;构建耗时从150s到60s再到10s&#xff0c;下面详细讲解下优化过程。 优化前现状 1.历史项目基于Vue3 Webpack5技术栈&#xff0c;其中webpack配置项由开发者自己维护&#xff08;没有使用vue/…

有哪些入耳舒服的蓝牙耳机?公认佩戴舒适度最高蓝牙耳机

数码科技市场日益发展的更加智能化&#xff0c;日常所接触到的各类产品都开始往智能化发展&#xff0c;鲜为人知的蓝牙耳机一直是不过时的&#xff0c;因为小巧易携带深受大众喜欢&#xff0c;下面整理了几款佩戴舒适的蓝牙耳机给大家。 一、南卡小音舱Lite2蓝牙耳机 售价&am…

java语法(一)基本概念、数据类型、字符串类、集合、Stream流、异常处理、文件处理IO流

文章目录 java程序运行流程JDK、JRE、JVM的关系 java数据类型基本数据类型基本数据类型之间的转换 引用数据类型数组类Java Bean重写 equals和hashcode 接口接口与类之间的关系 内置包装类装箱和拆箱包装类的应用Object类toString()equals()方法getClass() 方法接收任意引用类型…

QT如何打包生成独立可执行.exe文件

一、将QT程序使用Release编译 二、新建一个文件夹&#xff0c;将Release编译生成的exe文件复制到新建文件夹中 先找到Release编译生成的exe文件夹位置&#xff0c;与项目创建的文件夹有关&#xff1a; 临时文件夹 --》 release --》 xx .exe文件 比如我的这个就是在D:\QtPro\b…

vulnhub-RAVEN:2(MYSQL-UDF提权,手工提权/工具自动提权)

镜像下载&#xff1a;Raven: 2 ~ VulnHub 实验环境&#xff1a;kali&#xff1a;192.168.78.128 vulnhub镜像&#xff1a;192.168.78.133 1、kali查看本地ip地址&#xff0c;以便使用nmap扫描ip段存活主机 2、nmap扫描IP段&#xff0c;发现靶机的IP地址为192.168.78.133 4、访问…