题目链接: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)的更多相关文章

  1. 动态规划经典——最长公共子序列问题 (LCS)和最长公共子串问题

    一.最长公共子序列问题(LCS问题) 给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子序列,并返回其长度.例如: A = "HelloWorld"    B = & ...

  2. 【实习记】2014-08-29算法学习Boyer-Moore和最长公共子串(LCS)

        昨天的问题方案一:寻找hash函数,可行性极低.方案二:载入内存,维护成一个守护进程的服务.难度比较大.方案三:使用前5位来索引,由前3位增至前5位唯一性,理论上是分拆记录扩大100倍,但可以 ...

  3. 最长公共子序列问题 (LCS)

    给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度. 输入: n=4 m=4 s="abcd" t="becd" 输出: 3("bcd&qu ...

  4. 动态规划法(十)最长公共子序列(LCS)问题

    问题介绍   给定一个序列\(X=<x_1,x_2,....,x_m>\),另一个序列\(Z=<z_1,z_2,....,z_k>\)满足如下条件时称为X的子序列:存在一个严格 ...

  5. 【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 ...

  6. 最长公共子序列(LCS)、最长递增子序列(LIS)、最长递增公共子序列(LICS)

    最长公共子序列(LCS) [问题] 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字 ...

  7. 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题

    先要搞明白:最长公共子串和最长公共子序列的区别.    最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...

  8. 最长公共子序列(LCS)和最长递增子序列(LIS)的求解

    一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...

  9. 05_最长公共子序列问题(LCS)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题7: 问题描述:给两个子序列A和B,求长度最大的公共子序列.比如1,5,2,6,8,和2,3,5,6,9,8,4的最长公共子序 ...

随机推荐

  1. Linux字符设备简单示例

    1. Linux字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open.close.read和write系统调用.例如:串口.Led.按键等. 2. 通过字符设备文件 ...

  2. python3 zip()函数笔记

    a=[1,2,3]b=[4,5,6] for A ,B in zip(a,b):#用zip()函数整体打包 print(A,B)

  3. MERGE批量增删查改数据

    MERGE优点: 在批量处理数据的时候,我可以用到merge一次完成数据处理. 示例代码一: MERGE INTO student AS t using ( AS age) s ON t.Age=s. ...

  4. java从笨鸟到菜鸟

    链接别人的笔记 http://www.cnblogs.com/cugwx/p/3536840.html

  5. 转——深度学习之BN算法(Batch Normailization)

    Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce 一.背景意义 ...

  6. R语言安装程序包

    自动安装(在线安装) 在R的控制台,输入 install.packages("gridExtra") # 安装 gridExtra install.packages("s ...

  7. java——java只有值传递

    真的只有值传递! java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 答:值传递 这里说的很清楚了:https://www.cnblogs.com/zhouxiansheng/p/39 ...

  8. Xshell设置主机名高亮

    修改后的效果: 操作步骤: 情况①:如果是Ubuntu或者Debian,按照下面的流程,两步解决: 打开~/.bashrc. 修改参数force_color_prompt=yes去掉前面的注释#. 情 ...

  9. VBS 操作Excel

    VBS操作Excel 打开excel Dim objExcel,objWorkbook,objSheet Set objExcel=CreateObject("excel.applicati ...

  10. Robot Framework搭建

    需要安装的内容如下: 1. Python2.7.13(听说python3对RF支持的不是很好,所以我下的Python2) 2. wxPython 2.8.12.1(只能这个版本) 3. robotfr ...