最长公共单词,类似LCS,(POJ2250)
题目链接:http://poj.org/problem?id=2250
解题报告:
1、状态转移方程:
for(i=; i<=len1; i++)
{
for(j=; j<=len2; j++)
{
dp[i][j]=_max(i,j,dp[i-][j-]+same(i-,j-),dp[i-][j],dp[i][j-]);
}
}
2、记录决策
3、反序输出
#include <iostream>
#include <string.h>
#include <cstdio>
#include <algorithm> using namespace std; #define MAXV 110
#define MAXN 35 char stemp[MAXN];
char s1[MAXV][MAXN];
char s2[MAXV][MAXN];///记录单词 int len1,len2;///单词长度
int dp[MAXV][MAXV]; ///dp[i][j]表示s1的前i个单词,和s2的前j个单词,最长公共子单词 int p[MAXV][MAXV]; ///决策,如果s1的第i个单词,和s2的第j个单词相同,则为1,以便输出使用
int pos[MAXV]; ///输出结果
int sum; ///有几个单词 int _max(int i,int j,int a,int b,int c)
{
if(a>b&&a>c)
{
p[i][j]=; ///记录决策
return a;
}
else if(b>a&&b>c)
{
p[i][j]=;
return b;
}
p[i][j]=;
return c;
} int same(int x,int y)
{
if(!strcmp(s1[x],s2[y])) return ;
return ;
} void print(int i,int j)
{
if(p[i][j]==) ///即s1的第i个单词,和s2的第j个单词相同
{
pos[sum++]=i-; ///记录这个单词的位置
print(i-,j-);
}
else if(p[i][j]==)
print(i-,j);
else if(p[i][j]==)
print(i,j-);
} int main()
{
int i,j;
/// Input ///
while(scanf("%s",stemp)!=EOF)
{
len1=len2=;
strcpy(s1[len1++],stemp);
while()
{
scanf("%s",stemp);
if(!strcmp(stemp,"#")) break;
strcpy(s1[len1++],stemp);
} while()
{
scanf("%s",stemp);
if(!strcmp(stemp,"#")) break;
strcpy(s2[len2++],stemp);
} /// DP ///
memset(dp,,sizeof(dp));
memset(p,,sizeof(p)); for(i=; i<=len1; i++)
{
for(j=; j<=len2; j++)
{
dp[i][j]=_max(i,j,dp[i-][j-]+same(i-,j-),dp[i-][j],dp[i][j-]);
}
} /// Output ///
sum=;
print(len1,len2);
for(i=sum-; i>=; i--) ///反序输出
printf("%s ",s1[pos[i]]);
puts(""); }
return ;
}
最长公共单词,类似LCS,(POJ2250)的更多相关文章
- 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题
一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld" B = & ...
- 【实习记】2014-08-29算法学习Boyer-Moore和最长公共子串(LCS)
昨天的问题方案一:寻找hash函数,可行性极低.方案二:载入内存,维护成一个守护进程的服务.难度比较大.方案三:使用前5位来索引,由前3位增至前5位唯一性,理论上是分拆记录扩大100倍,但可以 ...
- 最长公共子序列问题 (LCS)
给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度. 输入: n=4 m=4 s="abcd" t="becd" 输出: 3("bcd&qu ...
- 动态规划法(十)最长公共子序列(LCS)问题
问题介绍 给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...
- 【Luogu P1439】最长公共子序列(LCS)
Luogu P1439 令f[i][j]表示a的前i个元素与b的前j个元素的最长公共子序列 可以得到状态转移方程: if (a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; d ...
- 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)
最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...
- 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题
先要搞明白:最长公共子串和最长公共子序列的区别. 最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- 05_最长公共子序列问题(LCS)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题7: 问题描述:给两个子序列A和B,求长度最大的公共子序列.比如1,5,2,6,8,和2,3,5,6,9,8,4的最长公共子序 ...
随机推荐
- OpenCV教程(转自:浅墨_毛星云博客)
2.图像的载入,显示和输出 一站式完全解析 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/detail ...
- docker 部署公司阿里云服务器 (一)
持续更新... 背景环境: 阿里云ecs服务器 centos7.4 公网地址:xx.xx.xx.xx 内网地址:172.16.77.4 阿里云RDS 阿里云 Redis 第 ...
- JS中==、===和Object.is()的区别
JS中==.===和Object.is()的区别 首先,先粗略了解一下这三个玩意儿: ==:等同,比较运算符,两边值类型不同的时候,先进行类型转换,再比较: ===:恒等,严格比较运算符,不做类型转换 ...
- Spring注入的反射解释
对于如下配置片段: <bean id="id" class="lee.Aclass"> <!--property配置需要依赖注入的属性-- ...
- javascript Array数组详解 各种方法
1.数组的声明方法(1): arrayObj = new Array(); //创建一个数组.复制代码 代码如下: var arr1 = new Array(); (2):arrayObj = new ...
- c++ 和 matlab 下的caffe模型输入差异
在向一个caffe模型传递输入数据的时候,要注意以下两点: 1. opencv中Mat数据在内存中的存放方式是按行存储,matlab中图像在内存中的存放方式是按列存储. 2. opencv中Mat数据 ...
- OpenStack Weekly Rank 2015.08.03
Module Reviews Drafted Blueprints Completed Blueprints Filed Bugs Resolved Bugs Cinder 7 1 1 7 11 Sw ...
- (转)Linux命令之md5sum
Linux命令之md5sum 原文:https://www.cnblogs.com/zhuxiaohou110908/p/5786893.html 1. 背景 在网络传输.设备之间转存.复制大文件等 ...
- machine learning 线性回归实战
matlab 线性回归实战 统一 输入时列向量 输出也是列向量 中间的过程可以出现行向量或者列向量,但是不能影响输入和输出为列向量 参数运算的输入都不会只是一个实数,要么是列向量,要么是一个矩阵 对于 ...
- 2.C#中的常用快捷键
快速对齐代码: Ctrl+K+D: 快速对齐代码 (如果代码语法错误,就不能使用) Ctrl+Z: 撤销 Ctrl+S:保存 没事就Ctrl+S一下,防止因为电脑断电,代码全部丢失 Ctr ...