简单LCS HDU_1503
学了一下最长公共子串,它是属于dp里面的 dp=max{(i,j-1),(i-1,j),(i-1,j-1)+d}问题,不得不说,规划方向确实厉害,当然这只适用于两个字符串匹配的问题,n个字符串的话,我查了一下,要用后缀数组,这个以后再来弄吧。
比较难的是记录公共字串,在DP的时候记录好搜索的方向,就可以询步骤得到公共串。尤其1503这题呢,除了把公共部分打印出来,还要把非公共部分打印出来。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[] , b[];
int dp[][];
int rec[][];
int dir[][];
int LCS(int r,int c)
{
if (dp[r][c]>=) return dp[r][c]; //用DP+记忆化搜索写的LCS
if (a[r-]==b[c-]){
dp[r][c]=LCS(r-,c-)+;
dir[r][c]=;
}
else
{
int dp1=LCS(r-,c);
int dp2=LCS(r,c-);
if (dp1>dp2){
dp[r][c]=dp1;
dir[r][c]=; //用dir记录规划的方向
}
else
{
dp[r][c]=dp2;
dir[r][c]=;
}
}
return dp[r][c];
}
void output(int r,int c)//已经用dir记录了规划方向,这里用递归将字符串还原出来
{
if (r==&&c==) return; //一开始这里犯糊涂了,写成或,要知道只有一个为0的话,还要把其他非公共部分打印出来,还得继续下去。
// cout<<"dir"<<" "<<r<<" "<<c<<" "<<dir[r][c]<<endl;
if (dir[r][c]==){
output(r-,c-);
printf("%c",a[r-]);
}
if (dir[r][c]==){ //此时a[r-1]相当于被抛弃了,所以可以打印了,下面同理
output(r-,c);
printf("%c",a[r-]);
}
if (dir[r][c]==){
output(r,c-);
printf("%c",b[c-]);
}
}
int main()
{
while (scanf("%s%s",a,b)!=EOF)
{
int len1=strlen(a);
int len2=strlen(b);
int i,j;
for (i=;i<=len1;i++){
for (j=;j<=len2;j++){
dp[i][j]=-;
if (i==||j==) dp[i][j]=;
if (i==) dir[i][j]=;//为了让output把所有非公共部分也打印完,得预先把这些设置好
if (j==) dir[i][j]=;
}
}
int ans=LCS(len1,len2);
output(len1,len2);
//printf("%d",ans);
putchar('\n');
}
}
简单LCS HDU_1503的更多相关文章
- UVA 11404 简单LCS模型DP 字典序比较
这个题目求某个字符串中含的最长的回文子串. 就是一个很简单的LCS模型吗,而且我不明白为什么网上这么多人都说仿照某写法把字符串先逆序一下,然后求LCS,我只想问一下,有必要吗? 直接按LCS的套路来就 ...
- 51nod1092(lcs简单运用/dp)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1092 题意:中文题诶- 思路: 解法1:最坏的情况就是在原字 ...
- UVa 111 History Grading (简单DP,LIS或LCS)
题意:题意就是坑,看不大懂么,结果就做不对,如果看懂了就so easy了,给定n个事件,注意的是, 它给的是第i个事件发生在第多少位,并不是像我们想的,第i位是哪个事件,举个例子吧,4 2 3 1, ...
- 我的第一篇博客----LCS学习笔记
LCS引论 在这篇博文中,博主要给大家讲一个算法----最长公共子序列(LCS)算法.我最初接触这个算法是在高中学信息学竞赛的时候.那时候花了好长时间理解这个算法.老师经常说,这种算法是母算法,即从这 ...
- SNMP简单网络管理协议(转载)
SNMP SNMP 网络管理的历史 美国国防部设计了世界上头几个包交换网之一的ARPANET,在70年代,TCP/IP协议族正式被定为军方通信标准,随着此协议的广泛使用,网络管理成了一件大事.在80年 ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- LightOJ1033 Generating Palindromes(区间DP/LCS)
题目要计算一个字符串最少添加几个字符使其成为回文串. 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=10 ...
- LCS记录路径
还想用hash记录……果然是天真.lcs转移比较简单,每次增加1.每次找是当前-1的就行了. #include <algorithm> #include <iostream> ...
- LCS nlog(n) 但最坏情况还是比较悲剧 转载的文章;
最长公共子序列问题: 给定2个字符串,求其最长公共子串.如abcde和dbada的最长公共字串为bd. 动态规划:dp[i][j]表示A串前i个和B串前j个的最长公共子串的长度. 则 若A[i] == ...
随机推荐
- 三十二、CI框架之配置域名和设置默认登陆网站
一.打开routes.php文件,将$route['default_controller'] = 'login'; 修改成我们需要的内容. 二.修改config.php中的base_url数据 三.L ...
- c# GlobalAddAtom GlobalDeleteAtom
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Spark的任务提交和执行流程概述
1.概述 为了更好地理解调度,我们先看一下集群模式的Spark程序运行架构图,如上所示: 2.Spark中的基本概念 1.Application:表示你的程序 2.Driver:表示main函数,创建 ...
- mongodb单机版的安装和配置
首先根据操作系统下载MongoDB的相关安装文件 下载后上传到linux上,解压 将解压后的文件夹重新命名为monggodb4.0.1 命令mv 配置必要的文件夹mgdata存放运行数据,mglog存 ...
- Codeforces 176B 经典DP
非常好的一个题目,CF上的DP都比较经典 题意就是 给定一个串A,B,正好执行K次操作,每次操作可以把 A串从中间切开,并调换两部分的位置,问最后得到B串共有多少种不同的切法(只要中间有一次不同,即视 ...
- vs code 切换语言(切换回英文)
安装中文 安装教程:https://www.cnblogs.com/chenxi188/protected/p/11757456.html 切换回英文 调出搜索:ctrl+shift+p 输入:lan ...
- junit基础学习之-测试controller层(2)
准备工作: eclipse本身带有junit4,可以直接build path,加入junit. 连接数据库的配置文件需要修改,之前的文件是采用properties+xml文件的形式,但是在测试的时候因 ...
- sql ,类型转换,日期截取格式
字符型 转换成整型 CONVERT(int ,字段) 只取年月日格式 CONVERT(varchar(10), ZB.drive_time, 120 ) SELECT CONVERT(VARCHAR, ...
- DW1000芯片定位技术解析
近些年来随着物联网和机器人技术的大发展,精确定位技术的热度也随之攀升.目前精确定位的技术有很多,如基于wifi.RFID.zigbee.超声波.UWB等技术都可以实现精准定位.由于技术的不同,精度也不 ...
- 【pwnable.kr】coin1
pwnable从入门到放弃又一发 说是一道pwnable,其实是一道coding... nc pwnable.kr 9007 连接上看看,玩硬币? 老子是来拿flag的,谁来哄孩子来了!!! 算了,f ...