HDU 1503【LCS】(字符串合并输出)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503
题目大意:
给两个字符串,组成一个长度尽可能小的字符串,它包含上述两个字符串,且原字符串中的字符在该串中的相对位置不变。
要结合样例来理解题意,本题主要难在如何输出题目要求字符串,这就需要我们仔细研究样例,去发掘它是如何输出的,具体操作见代码。
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int dp[][];
int vis[][]; //标记路径
int loca[], locb[]; //记录下最长公共子序列在这两个字符串中的位置
int lena, lenb; //a,b序列的长度
int len; //记录下最长公共子序列长度
string stra, strb; void locallcs(int i, int j) //标记好最长公共子序列的每一个字符分别在a,b字符中的位置
{
len = ;
while (i>&&j>)
{
if (vis[i][j] == )
{
loca[len] = i-; // 此时loca,locb数组记录的是最长公共子序列分别在啊a,b字符串中的位置
locb[len] = j-; //不过要注意此时记录的是逆序的,这个仔细看它存入的顺序就能明白
len++;
i--, j--;
}
else if (vis[i][j] == )j--;
else
i--;
}
} void output() //输出答案,至于为什么是这样输出,自己仔细研究题目的输出样例就能发现
{
int inverse = len - ;
int cur1 = ,cur2=;
while (inverse >= )
{
for (int i = cur1; i<loca[inverse]; i++) //输出a中两个相邻的公共子序列字符之间的字符
printf("%c", stra[i]);
for (int j = cur2; j < locb[inverse]; j++)
printf("%c", strb[j]);
printf("%c", stra[loca[inverse]]); //输出那个公共字符
cur1 = loca[inverse]+, cur2=locb[inverse]+;
inverse--;
}
for (int i = loca[]+; i < lena; i++)printf("%c", stra[i]); //输出最后一个公共子序列字符之后的字符
for (int j = locb[]+; j < lenb; j++)printf("%c", strb[j]);
cout << endl;
} int main()
{
while (cin >> stra >> strb)
{
lena = stra.length();
lenb = strb.length();
for (int i = ; i <= lena; i++)
{
for (int j = ; j <= lenb; j++)
{
if (!i || !j) {
dp[i][j] = ; continue;
}
if (stra[i - ] == strb[j - ])
{
dp[i][j] = dp[i - ][j - ] + ;
vis[i][j] = ; //标记输出路径
}
else if (dp[i - ][j] < dp[i][j - ]) //dp数组在本题起控制标记路径方向的作用
{
dp[i][j] = dp[i][j - ];
vis[i][j] = ;
}
else {
dp[i][j] = dp[i - ][j];
vis[i][j] = ;
}
}
}
locallcs(lena, lenb);
output();
}
return ;
}
HDU 1503【LCS】(字符串合并输出)的更多相关文章
- hdu 1503 LCS输出路径【dp】
hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左 ...
- Advanced Fruits(HDU 1503 LCS变形)
Advanced Fruits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu 1503, LCS variants, find a LCS, not just the length, backtrack to find LCS, no extra markup 分类: hdoj 2015-07-18 16:24 139人阅读 评论(0) 收藏
a typical variant of LCS algo. the key point here is, the dp[][] array contains enough message to de ...
- 题解报告:hdu 1503 Advanced Fruits(LCS加强版)
Problem Description The company "21st Century Fruits" has specialized in creating new sort ...
- HDU 1503 Advanced Fruits (LCS,变形)
题意: 给两个水果名,要求他们的LCS部分只输出1次,其他照常输出,但是必须保持原来的顺序! 思路: 求LCS是常规的,但是输出麻烦了,要先求LCS,再标记两串中的所有LCS字符,在遇到LCS字符时, ...
- 华为OJ:字符串合并处理
字符串合并处理 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在 ...
- Java实现 蓝桥杯 算法训练 字符串合并
试题 算法训练 字符串合并 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入两个字符串,将其合并为一个字符串后输出. 输入格式 输入两个字符串 输出格式 输出合并后的字符串 样例 ...
- 优化php代码 - 字符串echo输出 逗号也可作php连接符
2016年12月12日10:00:16 ====================== 网页访问速度的提升,是可以通过代码的优化来实现的.代码的优化,并不是说代码越少越好,而是主要看代码的运行能力和执行 ...
- HDU 1274 展开字符串 (递归+string类)
题目链接:HDU 1274 展开字符串 中文题. 左括号进入DFS函数,右括号return到上一层. 注意return回去的是这个一层递归中的括号中的字母串. AC代码: #include<st ...
随机推荐
- luogu P4289 [HAOI2008]移动玩具
传送门 这道题可以二进制记录状态搜索 也可以做以下考虑 若一个棋子要移动到另一个位置上去,则步数为两点的曼哈顿距离(横坐标差的绝对值+纵坐标差的绝对值),因为假设路径上有其他的棋子,可以通过移动其他棋 ...
- resolution will not be reattempted until the update interval of repository-group has elapsed or updates are forced
Failed to execute goal on project safetan-web: Could not resolve dependencies for project com.safeta ...
- ACM-ICPC 2018 徐州赛区网络预赛 G题
题目链接: https://nanti.jisuanke.com/t/31459 具体思路: 先顺序输入,然后回溯,假设已经加入了n个点,那么在加入的同时,首先看一下原先x轴上已经有过的点,找到第一个 ...
- semantic segmentation 和instance segmentation
作者:周博磊链接:https://www.zhihu.com/question/51704852/answer/127120264来源:知乎著作权归作者所有,转载请联系作者获得授权. 图1. 这张图清 ...
- WPF版公司的自动签到程序
1.外包公司要求早上签到,就写了一个自动打卡程序. 2.一直都想写这个程序,可是一直没有思路,知道有个软件公司找我做自动答题程序,于是自动打卡程序才应运而生.未来可以将自动答题程序开源工大家查看. 3 ...
- python实战===教你用微信每天给女朋友说晚安
但凡一件事,稍微有些重复.我就考虑怎么样用程序来实现它. 这里给各位程序员朋友分享如何每天给朋友定时微信发送”晚安“,故事,新闻,等等··· ···最好运行在服务器上,这样后台挂起来更方便. 准备: ...
- 八大最安全的Linux发行版,具备匿名功能,做服务器的首选,web,企业服务器等
10 best Linux distros for privacy fiends and security buffs in 2017 Introduction The awesome operati ...
- 【转】Visual Studio——多字节编码与Unicode码
多字节字符与宽字节字符 1) char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t. char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因为 ...
- CentOS 6.5下PXE+Kickstart无人值守安装操作系统centos7.3
CentOS 6.5下PXE+Kickstart无人值守安装操作系统centos7.3 一.简介 1.1 什么是PXE PXE(Pre-boot Execution Environment,预启动执行 ...
- eclipse:刪除空行
ctrl+F:選擇正則,輸入:^\s*\n ,點擊 replace all.