题目链接:http://poj.org/problem?id=1458

思路分析:经典的最长公共子序列问题(longest-common-subsequence proble),使用动态规划解题。

1)问题定义:给定两个序列X=<X1, X2, ...., Xm>和Y = <Y1, Y2, ...., Yn>,要求求出X和Y长度最长的最长公共子序列;

2)问题分析:

<1>动态规划问题都是多阶段决策最优化问题;在这些问题中,问题可以被划分为多个阶段,每个阶段都需要作出一个决策,在问题的多阶段决策中,

按某一顺序,根据每一步所选决策的不同,将随即引起状态的转移,最终在变化的状态中产生一个决策序列。动态规划就是为了使产生的决策序列

                     在符合某种条件下达到最优。另外,由于动态规划问题具有最优子结构,所以整体中的最优解一定包含子问题的最优解;

如果从图的搜索角度来看,则存在一个状态之间相互连接的有向图,当前状态所做出的每一个可能的决策都或引出一条通向下一状态的边,而且该边具

有权重;动态规划问题即为从初始状态寻找一条通往最终的目标状态的最优路径;在寻找最优路径时,由于最优子结构性质可知,在最优路径中,从初

始状态到最佳路径中的每一个状态的路径都是最佳路径;所以我们需要先寻找出到入射到目标状态的各个前一状态的最佳路径,即求解子问题的最优解;

所以,在该具体的问题中,我们定义序列X=<X1, X2, ..., Xi>和序列Y=<Y1, Y2,..., Yj>中的公共子序列长度为一个状态,即为dp[i, j],每次的决策为判断

X[i]与Y[j]是否相等,如果相等,则引出一条到下一状态dp[i-1, j-1]的边,权重为1,否则会引出两条到下一状态的边,这两个状态分别为dp[i-1, j]与

dp[i, j -1],边的权重都为0;通过从目标状态开始后向求解问题,即要求出从初始状态到目标状态的最优解,则要先求出从目标状态到入射到该目标状态

的前一状态的最优解;

3)问题解答:

由定义的状态以及状态之间的转移所做出的决策,我们可以推断出状态方程: if X[i] == Y[j], dp[i][j] = dp[i-1][j-1] + 1,

否则, dp[i][j] = MAX(dp[i-1][j] , dp[i][j-1]);

代码如下:

#include <iostream>
#include <string.h>
using namespace std; const int MAX_N = + ;
int dp[MAX_N][MAX_N];
char X[MAX_N], Y[MAX_N]; void Lcs( int XLen, int YLen )
{
for ( int i = ; i <= XLen; ++i )
for( int j = ; j <= YLen; ++j )
{
if ( X[i-] == Y[j-] )
dp[i][j] = dp[i-][j-] + ;
else
if ( dp[i-][j] >= dp[i][j-] )
dp[i][j] = dp[i-][j];
else
dp[i][j] = dp[i][j-];
}
} int main()
{
while ( scanf( "%s %s", X, Y ) != EOF )
{
int XLen, YLen; memset( dp, , sizeof(dp) ); XLen = strlen( X );
YLen = strlen( Y );
Lcs( XLen, YLen ); printf( "%d\n", dp[XLen][YLen] );
} return ;
}

poj 1458 Common Subsequence(区间dp)的更多相关文章

  1. poj 1458 Common Subsequence(dp)

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 46630   Accepted: 19 ...

  2. POJ 1458 Common Subsequence (DP+LCS,最长公共子序列)

    题意:给定两个字符串,让你找出它们之间最长公共子序列(LCS)的长度. 析:很明显是个DP,就是LCS,一点都没变.设两个序列分别为,A1,A2,...和B1,B2..,d(i, j)表示两个字符串L ...

  3. LCS POJ 1458 Common Subsequence

    题目传送门 题意:输出两字符串的最长公共子序列长度 分析:LCS(Longest Common Subsequence)裸题.状态转移方程:dp[i+1][j+1] = dp[i][j] + 1; ( ...

  4. POJ 1458 Common Subsequence(LCS最长公共子序列)

    POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...

  5. (线性dp,LCS) POJ 1458 Common Subsequence

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65333   Accepted: 27 ...

  6. POJ - 1458 Common Subsequence DP最长公共子序列(LCS)

    Common Subsequence A subsequence of a given sequence is the given sequence with some elements (possi ...

  7. OpenJudge/Poj 1458 Common Subsequence

    1.链接地址: http://poj.org/problem?id=1458 http://bailian.openjudge.cn/practice/1458/ 2.题目: Common Subse ...

  8. POJ 1458 Common Subsequence(最长公共子序列LCS)

    POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...

  9. POJ 1458 Common Subsequence (动态规划)

    题目传送门 POJ 1458 Description A subsequence of a given sequence is the given sequence with some element ...

随机推荐

  1. 新浪微博 2.4sdk 一闪而过

    解决方法,保持 ios应用中的 build id和 开放平台中填写的一致

  2. 深入理解 IE haslayout

    转载自Bubblings Blog 原文地址:http://riny.net/2013/haslayout/ 1.什么是haslayout layout是windows IE的一个私有概念,它决定了元 ...

  3. 驴吃胡萝卜问题——牛客/FEI

    一个商人骑一头驴要穿越1000公里长的沙漠,去卖3000根胡萝卜.已知驴一次性可驮1000根胡萝卜,但每走1公里又要吃掉1根胡萝卜.问:商人最多可卖出多少胡萝卜? 一个商人骑一头驴要穿越1000公里长 ...

  4. (转)Windows重启延迟删除,重命名技术原理

    所谓重启延迟删除技术,就是在操作系统启动前删除或者替换文件! 说起重启延迟删除,大家可能都很陌生,但是实际上,该功能已经被各种软件所采用:如安装Windows 补丁程序(如:HotFix.Servic ...

  5. JQuery中回车键登陆

    //点击回车键 //王东升/2015/3/11 document.onkeydown = function (event) { var e = event ? event : (window.even ...

  6. [转] IOS中AppDelegate中的生命周期事件的调用条件

    IOS中AppDelegate中的生命周期事件的调用条件 //当应用程序将要进入非活动状态执行,在此期间,应用程序不接受消息或事件,比如来电 - (void)applicationWillResign ...

  7. 有意思的C宏

    在Linux内核.嵌入式代码等传统的C代码里,会有一些难以识别的宏定义.我记得在eCos, UBoot, FFmpeg有一些比较BT的宏定义,很难读懂.对于C++程序员来说,最好将这种难读的宏定义转成 ...

  8. QT 子窗口监听主窗口信号(超级简单,但是好用,比如主窗口移动的时候,子窗口不要再继续处理任务)

    MainWindow *ptr = NULL; ptr = (MainWindow*)parentWidget(); connect(ptr, SIGNAL(param_result(bool)), ...

  9. CI引入外部javascript和css

    假定baseurl 为 $config['base_url']='http://localhost/codeigniter/'; 调用 <link rel="stylesheet&qu ...

  10. nodejs--express开发博客系统(三)

    上一节已经实现了登录.注册.发表文章和文章读取的功能,今天咱加上评论.文章页面和作者页面. 评论只能在进入文章页面后才能进行,所以咱们先写文章页面. 在上一节的代码中,我已经给文章标题添加了超链接了, ...