题目链接: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. oracle execute immediate

    declare   aa         ,);   l_cnt      );   i_yr       ;   i_curCode  ) :='001';   i_vDate    date := ...

  2. os基础

    命令:指计算机用户要求计算机系统为其工作的指示: 命令的表示形式: 1.字符形式: 2.菜单形式: 3.图形形式: 命令的使用方式:1. 脱机使用方式 off_line       2.联机使用方式  ...

  3. Error (0xc0000225) installing Windows 8 R2 on VirtualBox

    Windows Boot Manager Windows failed to start. A recent hardware or software change might be the caus ...

  4. 关于MATLAB中any和all的个人理解

    any: any=1,有一个元素是1,即可: any=0,全部元素为0,即可. all: all=1,全部元素是1,即可: all=0,有一个元素是0,即可. ALL True if all elem ...

  5. 数组名和指针的深入理解(C++)

    指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.魔幻数组名请看程序(本文程序在WIN32平台下编译): #includ ...

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

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

  7. 【转】关于UItableViewCell的accessoryType属性

    转载自:http://blog.csdn.net/kmyhy/article/details/6442351 使用的话,例如: cell.accessoryType = UITableViewCell ...

  8. IOS 表视图(UITableVIew)的使用方法(2)名单的分段显示

    我们可以采用名字分段法,名字分段会在之后的小节中显示,这是转而使用球员的角色分段发,以最直接的入手点讲解好UITableView的分段使用方法.本节示例时基于上节的SimpleTableViewCon ...

  9. Java 多线程 socket 取款例子 runnable callable

    socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465 取款部分参考 http://blog.csdn.net/dayday198 ...

  10. 使用Project进行挣值分析

        挣值分析(EV)技术是一种根据项目的成本基准来度量和分析项目绩效的方法.挣值分析的结果可以指出项目在成本和进度方面存在的偏差.EV分析结合了成本,进度,已完成工作等各种因素来衡量项目的绩效,并 ...