最长公共单词,类似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的最长公共子序 ...
随机推荐
- @AutoConfigureAfter不生效 @Configration bean的创建顺序
https://gooroo.io/GoorooTHINK/Article/17466/Lessons-Learned-Writing-Spring-Boot-Auto-Configurations/ ...
- 1.3 IDAE 中使用GO开发项目
创建GO文件 在GO项目的文件夹上右键,选择Go file,Kind选择简单应用,这样创建一个具有main入口的Go file 点击这个按钮,即可运行代码
- php数组·的方法-数组检索
/* * //数组检索函数 * */ //array_keys() 获取数组中所有键名 //array_values() 获取数组中所有键名 $arr6=range('a','e'); print_r ...
- Robot Framework常用库简介
标准库 Robot Framework可以直接导入使用的库,包括: • Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 • Dialogs:提供了暂停测试执行和从用户的 ...
- 多线程编程_CountDownLatch
CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同 ...
- Caused by: java.net.URISyntaxException: Relative path in absolute URI
<property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> ...
- Fedora14 mount出现错误时解决办法【亲测有效】
挂载时出现了如上图所示问题,看第一条英语提示,我刚开始以为是文件权限不够,改了权限之后,依旧存在这样的问题, 于是,我上网查阅了一些资料: 在解决之前,先让我们一起来了解一下nfs: NFS最大功能就 ...
- 021-动态生成验证码jsp代码模板
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 【Linux】Debian 8 设置命令行界面的文本颜色
平时我们操作的系统命令行界面文本默认黑底白字,有时候会看不惯这种全篇都是白色字符,这个时候可以通过改变PS1环境变量来改变文本颜色.我个人喜欢黑底绿字的搭配,以下是我个人的命令行界面样式: 注意:以下 ...
- Linux禁ping
A.临时允许PING操作的命令为:# >/proc/sys/net/ipv4/icmp_echo_ignore_all B.永久允许PING配置方法. /etc/sysctl.conf 中增加一 ...