算法体系-21 第二十一 暴力递归到动态规划(三)

一 最长回文子串

1.1 描述

给定一个字符串str,返回这个字符串的最长回文子序列长度

比如 : str = “a12b3c43def2ghi1kpm”

最长回文子序列是“1234321”或者“123c321”,返回长度7

1.2 分析

1.2.1 先将原传逆序,求原串和反转后的串的最长公共子序列就是原串的最长回文子序列

1.2 分析

1.2.1 先将原传逆序,求原串和反转后的串的最长公共子序列就是原串的最长回文子序列

1.3 反转求最长公共子序列 代码

    public static int longestPalindromeSubseq1(String s) {if (s == null || s.length() == 0) {return 0;}if (s.length() == 1) {return 1;}char[] str = s.toCharArray();char[] reverse = reverse(str);return longestCommonSubsequence(str, reverse);}public static int longestCommonSubsequence(char[] str1, char[] str2) {int N = str1.length;int M = str2.length;int[][] dp = new int[N][M];dp[0][0] = str1[0] == str2[0] ? 1 : 0;for (int i = 1; i < N; i++) {dp[i][0] = str1[i] == str2[0] ? 1 : dp[i - 1][0];}for (int j = 1; j < M; j++) {dp[0][j] = str1[0] == str2[j] ? 1 : dp[0][j - 1];}for (int i = 1; i < N; i++) {for (int j = 1; j < M; j++) {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);if (str1[i] == str2[j]) {dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1);}}}return dp[N - 1][M - 1];}

1.3.1 分析二 上节用的是样本对应模型,这里用别的做法 (范围尝试模型 这种模型特别在乎讨论开头如何如何 结尾如何如何)

样本对应模型(特别在乎两个样本结尾如何如何) 范围尝试模型往开头如何如何,结尾如何如何

范围讨论如下-递归含义的定义如下

1.3.2 分析 有以下四种情况

1)不以L开头,不以R结尾

2)以L开头,不以R结尾

3)不以L开头,以R结尾

4)以L开头,以R结尾

1.4 尝试递归代码

    public static int lpsl1(String s) {if (s == null || s.length() == 0) {return 0;}char[] str = s.toCharArray();return f(str, 0, str.length - 1);}// str[L..R]最长回文子序列长度返回public static int f(char[] str, int L, int R) {if (L == R) {return 1;}if (L == R - 1) {return str[L] == str[R] ? 2 : 1;}int p1 = f(str, L + 1, R - 1);int p2 = f(str, L, R - 1);int p3 = f(str, L + 1, R);int p4 = str[L] != str[R] ? 0 : (2 + f(str, L + 1, R - 1));return Math.max(Math.max(p1, p2), Math.max(p3, p4));}

1.5 改动态规划分析

除了if (L == R) {

return 1;}

if (L == R - 1) {

return str[L] == str[R] ? 2 : 1;}

这两位置之后,其他位置的填的方法 从底往上填 每一行从左往右er

//跟进下面得图形推导出所求剩下得范围

for (int i = N - 3; i >= 0; i--)

for (int j = i + 2; j < N; j++)

1.6改动太规划代码

    public static int longestPalindromeSubseq2(String s) {if (s == null || s.length() == 0) {return 0;}if (s.length() == 1) {return 1;}char[] str = s.toCharArray();int N = str.length;int[][] dp = new int[N][N];dp[N - 1][N - 1] = 1;for (int i = 0; i < N - 1; i++) {dp[i][i] = 1;dp[i][i + 1] = str[i] == str[i + 1] ? 2 : 1;}//跟进上面得图形推导出所求剩下得范围for (int i = N - 3; i >= 0; i--) {for (int j = i + 2; j < N; j++) {dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]);if (str[i] == str[j]) {dp[i][j] = Math.max(dp[i][j], dp[i + 1][j - 1] + 2);}}}return dp[0][N - 1];}}

二 返回象棋从一个位置到另一个位置的方法有多少种

2.1 描述

请同学们自行搜索或者想象一个象棋的棋盘,

然后把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置

那么整个棋盘就是横坐标上9条线、纵坐标上10条线的区域

给你三个 参数 x,y,k

返回“马”从(0,0)位置出发,必须走k步

最后落在(x,y)上的方法数有多少种?

象棋走的日

2.2 分析 样本对应模型

跳的所有8方法

2.3 递归代码

// 当前来到的位置是(x,y)// 还剩下rest步需要跳// 跳完rest步,正好跳到a,b的方法数是多少?// 10 * 9public static int jump(int a, int b, int k) {return process(0, 0, k, a, b);}public static int process(int x, int y, int rest, int a, int b) {if (x < 0 || x > 9 || y < 0 || y > 8) {return 0;}if (rest == 0) {return (x == a && y == b) ? 1 : 0;}int ways = process(x + 2, y + 1, rest - 1, a, b);ways += process(x + 1, y + 2, rest - 1, a, b);ways += process(x - 1, y + 2, rest - 1, a, b);ways += process(x - 2, y + 1, rest - 1, a, b);ways += process(x - 2, y - 1, rest - 1, a, b);ways += process(x - 1, y - 2, rest - 1, a, b);ways += process(x + 1, y - 2, rest - 1, a, b);ways += process(x + 2, y - 1, rest - 1, a, b);return ways;}

2.4 改动态规划

是个三维数组,要的是rest的数据,rest要的数据是rest-1的数据 最终rest==0又是知道的

    public static int dp(int a, int b, int k) {int[][][] dp = new int[10][9][k + 1];dp[a][b][0] = 1;for (int rest = 1; rest <= k; rest++) {for (int x = 0; x < 10; x++) {for (int y = 0; y < 9; y++) {int ways = pick(dp, x + 2, y + 1, rest - 1);ways += pick(dp, x + 1, y + 2, rest - 1);ways += pick(dp, x - 1, y + 2, rest - 1);ways += pick(dp, x - 2, y + 1, rest - 1);ways += pick(dp, x - 2, y - 1, rest - 1);ways += pick(dp, x - 1, y - 2, rest - 1);ways += pick(dp, x + 1, y - 2, rest - 1);ways += pick(dp, x + 2, y - 1, rest - 1);dp[x][y][rest] = ways;}}}return dp[0][0][k];}public static int pick(int[][][] dp, int x, int y, int rest) {if (x < 0 || x > 9 || y < 0 || y > 8) {return 0;}return dp[x][y][rest];}

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

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

相关文章

[C++] vector list 等容器的迭代器失效问题

标题&#xff1a;[C] 容器的迭代器失效问题 水墨不写bug 正文开始&#xff1a; 什么是迭代器&#xff1f; 迭代器是STL提供的六大组件之一&#xff0c;它允许我们访问容器&#xff08;如vector、list、set等&#xff09;中的元素&#xff0c;同时提供一个遍历容器的方法。然而…

2024上半年软考---江苏考区最先公布成绩

经历了考试之后&#xff0c;最期待的就是考试成绩的公布了&#xff0c;最好的成绩是45、45、45.只要过了分数线就满足了。下面我们来看看各大考区的分数的公布时间。 提前说下江苏考区的时间比较早&#xff0c;我就是江苏考区的&#xff0c;希望本次可以顺利通过考试。 2024年…

零基础到高手蜕变:一步到位Jupyter Notebook安装全攻略

前言 对于数据分析、机器学习、科学研究等领域的工作者来说&#xff0c;Jupyter Notebook 已经成为了一种不可或缺的工具。它的交互式编程界面&#xff0c;使得数据分析过程更加直观和高效。但并非所有人都熟悉如何安装和配置Jupyter Notebook&#xff0c;特别是在不同的操作系…

在typora中利用正则表达式,批量处理图片

一&#xff0c;png格式 在 Typora 中批量将 HTML 图片标签转换为简化的 Markdown 图片链接&#xff0c;且忽略 alt 和 style 属性&#xff0c;可以按照以下步骤操作&#xff1a; 打开 Typora 并加载你的文档。按下 Ctrl H&#xff08;在 Windows/Linux 上&#xff09;或 Cmd…

Unity C#调用Android,IOS震动功能

最近在Unity上需要很原生移动端进行交互&#xff0c; 原理&#xff1a;新建一个android项目&#xff0c;把生成的app module给干掉&#xff0c;然后留下一个vibrationPlugin module&#xff0c;在这个module下写android震动代码&#xff0c;将这个android工程构建出来的 aar移…

2024数据库期末综合解析(部分题)

目录 第4关&#xff1a;数据记录修改 任务描述 补充 答案&#xff1a; 第6关&#xff1a;数据查询二 任务描述 补充 答案&#xff1a; 第4关&#xff1a;数据记录修改 任务描述 湖南人口hnpeople数据表如下所示 各字段含义如下 cs&#xff08;城市)、qx(区县)、rk(人口)、man(男…

115.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-调试优化结构体类型数据的创建

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

理解DDD设计

DDD的理解 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;是一种软件开发方法论&#xff0c;强调将业务领域作为软件设计的核心&#xff0c;以便更好地满足业务需求。DDD认为&#xff0c;软件开发的核心是理解业务&#xff0c;而不是实现技术。在D…

​晶体管高频等效电路

目录 混合Π等效电路 Y参数等效电路 混合Π与Y参数等效电路的转换 混合Π等效电路 共射三极管的等效电路。 Y参数等效电路 混合Π与Y参数等效电路的转换

异或运算的原理以及应用

异或&#xff08;XOR&#xff09;是计算机科学和数字电路中常用的运算之一。异或运算符通常用符号“⊕”或“^”表示&#xff0c;它有着简单而独特的性质&#xff0c;使其在数据加密、错误检测与纠正等多个领域得到了广泛的应用。在网络上我们传输的每一比特数据都经过了异或运…

unity 简易异步socket

1.unity 同步socket 改异步 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net.Sockets; using UnityEngine.UI; using System.Threading; using System;public class Echo : MonoBehaviour {//定义套接字Socket socket;//UG…

【C#】使用JavaScriptSerializer序列化对象

在C#开发语言编程中&#xff0c;通常使用系统内置的JavaScriptSerializer类来序列化对象&#xff0c;以便将其转换为JSON格式的文本存储与后台服务通信, 在这里将为大家详细介绍一下这个过程。 文章目录 反序列化序列化忽略属性 假设处理的数据中有一个对象类, 如下 public cl…

Linux系统脚本开机自启动,开机自启动jar包vue前台等

脚本内容jiaobenname.sh #!/bin/bash # 设置环境变量 export JAVA_HOME/usr/local/java/jdk-17.0.10 export CLASSPATH.:$JAVA_HOME/lib/ export PATH.:$JAVA_HOME/bin:$PATHwhile true; doif ps aux | grep -v grep | grep "tomcat" > /dev/null; thenecho &quo…

ppt添加圆角矩形,并调整圆角弧度方法

一、背景 我们看的论文&#xff0c;许多好看的图都是用PPT做的&#xff0c;下面介绍用ppt添加圆角矩形&#xff0c;并调整圆角弧度方法。 二、ppt添加圆角矩形&#xff0c;并调整圆角弧度 添加矩形&#xff1a; 在顶部工具栏中&#xff0c;点击“插入”选项卡。 在“插图”…

索引-定义、创建(CREATE INDEX)、删除(DROP INDEX)

一、概述 1、索引是SQL语言定义的一种数据对象&#xff0c;是大多数DBMS为数据库中基本表创建的一种辅助存取结构&#xff0c;用于响应特定查询条件进行查询时的查询速度&#xff0c;DBMS根据查询条件从数据库文件中&#xff0c;选择出一条或者多条数据记录以供检索&#xff0…

springboot优雅shutdown时异步线程安全优化

前面针对graceful shutdown写了两篇文章 第一篇&#xff1a; https://blog.csdn.net/chenshm/article/details/139640775 只考虑了阻塞线程&#xff0c;没有考虑异步线程 第二篇&#xff1a; https://blog.csdn.net/chenshm/article/details/139702105 第二篇考虑了多线程的安全…

基于C#开发web网页管理系统模板流程-参数传递

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 当用户长时间未在管理系统界面进行操作&#xff0c;或者用户密码进行了更改&#xff0c;显然用户必须重新登录以验证身份&#xff0c;如何实现这个功能呢&#xff1f; HTTP Cookie&#xff08;也叫 …

【Linux】 进程信号的发生

送给大家一句话&#xff1a; 何必向不值得的人证明什么&#xff0c;生活得更好&#xff0c;乃是为你自己。 -- 亦舒 进程信号的发生 1 何为信号2 信号概念的基础储备3 信号产生kill系统调用alarm系统调用异常core term Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢…

【教程】设置GPU与CPU的核绑(亲和力Affinity)

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 简单来说&#xff0c;核绑&#xff0c;或者叫亲和力&#xff0c;就是将某个GPU与指定CPU核心进行绑定&#xff0c;从而尽可能提高效率。 推荐与进程优先…

1055 集体照(测试点3, 4, 5)

solution 从后排开始输出&#xff0c;可以先把所有的学生进行排序&#xff08;身高降序&#xff0c;名字升序&#xff09;&#xff0c;再按照每排的人数找到中间位置依次左右各一个进行排列测试点3&#xff0c; 4&#xff0c; 5&#xff1a;k是小于10的正整数&#xff0c;则每…