最长公共子序列 输出路径

2024-09-04 23:08

本文主要是介绍最长公共子序列 输出路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

刚开始看到题目的时候还挺乐的这不简单嘛,看到输出的是随便一个路径的时候我傻了!一开始想的复杂了来个结构体记录前一个是有谁转移来的然后记录前一个点转移过来时的字符是啥 然后还写了个递归输出,每次递归还要判断输出的字母是不是重了,结果崩溃了.。。。。。之后又想到我开个三维数组ma[i][j][3]表示这个点有哪一个点转移过来 然后就整出来了这么些个玩意然后又发现了这TM除了 ma[i][j][2]=i;这句没有别的新值引入啊这不就全相等了么,然后看这个状态肯定有相邻的转过来只有在两个字母相等的时候才会引入新字母 也就是i,j ->i-1,j-1得来那么就不如直接记录下标了 最后三个判断分别判断是有那个状态转移过来如果是相等的那种情况那就直接输出得了。

if(a[i]==b[j]){dp[i][j]=dp[i-1][j-1]+1;ma[i][j][0]=ma[i-1][j-1][0],ma[i][j][1]=ma[i-1][j-1][1],ma[i][j][2]=i;}else {if(dp[i-1][j]>dp[i][j-1]){dp[i][j]=dp[i-1][j];ma[i][j][0]=ma[i-1][j][0],ma[i][j][1]=ma[i-1][j][1],ma[i][j][2]=ma[i-1][j][2];}else{dp[i][j]=dp[i][j-1];ma[i][j][0]=ma[i][j-1][0],ma[i][j][1]=ma[i][j-1][1],ma[i][j][2]=ma[i][j-1][2];}}

 然后又出现了一个小毛病,我数组是从0开始的但是要用到 i-1这时候就得避免负数出现这时候只要统一加上一个1就行。

#include <iostream>
#include <cstdio>
#include <set>
#include <map>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
int dp[2000][3000];
int ma[2000][2000][3];
string a,b;
/*void dfs(int x,int y){int x1=ma[x][y][0],y1=ma[x][y][1];if(ma[x][y][2]<0)return;if(ma[x][y][2]==ma[x1][y1][2]){dfs(x1,y1);}else{dfs(x1,y1);cout<<a[ma[x][y][2]];}
}*/
int main(){while(cin>>a>>b){memset(ma,0,sizeof(ma));dp[0][0]=0;for(int i=1;i<=a.size();i++){for(int j=1;j<=b.size();j++){if(a[i-1]==b[j-1]){dp[i][j]=dp[i-1][j-1]+1;ma[i][j][0]=i-1,ma[i][j][1]=j-1,ma[i][j][2]=i-1;}else {if(dp[i-1][j]>dp[i][j-1]){dp[i][j]=dp[i-1][j];ma[i][j][0]=i-1,ma[i][j][1]=j;}else{dp[i][j]=dp[i][j-1];ma[i][j][0]=i,ma[i][j][1]=j-1;}}}}//cout<<dp[a.size()][b.size()]<<endl;int l=0;int i=a.size(),j=b.size();char sc[1008];while(l<dp[a.size()][b.size()]){if(ma[i][j][0]==i-1&&ma[i][j][1]==j-1){sc[++l]=a[ma[i][j][2]];i--,j--;}else if(ma[i][j][0]==i-1&&ma[i][j][1]==j){i--;}else if(ma[i][j][0]==i&&ma[i][j][1]==j-1){j--;}}for(int i=l;i>=1;i--)cout<<sc[i];cout<<endl;}
}

 

这篇关于最长公共子序列 输出路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137298

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs