poj 1458 Common Subsequence(区间dp)
题目链接: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)的更多相关文章
- poj 1458 Common Subsequence(dp)
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 46630 Accepted: 19 ...
- POJ 1458 Common Subsequence (DP+LCS,最长公共子序列)
题意:给定两个字符串,让你找出它们之间最长公共子序列(LCS)的长度. 析:很明显是个DP,就是LCS,一点都没变.设两个序列分别为,A1,A2,...和B1,B2..,d(i, j)表示两个字符串L ...
- LCS POJ 1458 Common Subsequence
题目传送门 题意:输出两字符串的最长公共子序列长度 分析:LCS(Longest Common Subsequence)裸题.状态转移方程:dp[i+1][j+1] = dp[i][j] + 1; ( ...
- POJ 1458 Common Subsequence(LCS最长公共子序列)
POJ 1458 Common Subsequence(LCS最长公共子序列)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?c ...
- (线性dp,LCS) POJ 1458 Common Subsequence
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65333 Accepted: 27 ...
- POJ - 1458 Common Subsequence DP最长公共子序列(LCS)
Common Subsequence A subsequence of a given sequence is the given sequence with some elements (possi ...
- OpenJudge/Poj 1458 Common Subsequence
1.链接地址: http://poj.org/problem?id=1458 http://bailian.openjudge.cn/practice/1458/ 2.题目: Common Subse ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- POJ 1458 Common Subsequence (动态规划)
题目传送门 POJ 1458 Description A subsequence of a given sequence is the given sequence with some element ...
随机推荐
- 史上最简单的Hibernate入门简单介绍
事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate ...
- 一个页面从输入URL到页面加载显示完成的详细过程
下面以访问baidu页面来做一个过程分析 输入 URL:http://www.baidu.com DNS 域名解析 计算机无法识别域名,计算机与计算机之间要想进行通信,必须通过ip地址用来定位该计算机 ...
- slf4j+log4j配置(Maven)
首先配置Maven依赖 <!-- http://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency& ...
- QT中QWidget、QDialog及QMainWindow的区别
本文转自http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基 ...
- [C#绘图]Matrix类
想要从入门到精通一门语言,最好的学习文档就是官方提供的文档,比如说OpenCV的学习,最权威的学习资料还是其官方的学习文档,C#和.net的最好的学习入门文档还是MSDN.但是好多人一开始真的不会用, ...
- Hibernate学习之hql查询语句
* 页面上数据的字段和数据库中字段差不多,这个时候,采用迫切连接 结构比较好,如果页面上的字段很少,要按照需求加载数据,采用带构造函数的select查询 实例讲解:转自:http://www.cn ...
- 托管服务帐号(Managed Service Account)
托管服务帐号是绑定到单独的机器上,并且仅用于服务所用,所以不能用来登录. 创建托管帐号,不需要指定密码,密码会由活动目录自动管理.并且根据密码策略(默认30天)自动刷新,期间不影响服务. 在创建完之后 ...
- Symfony框架系列----常用命令
一.常用命令 从Entity操作数据库: app/console doctrine:database:create # 创建数据库 app/console doctrine:schema:update ...
- awk的用法(转)
awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输 ...
- C和指针 读书笔记
准备复习一下之前读过的<C和指针>,主要看之前标记过的地方. 感觉像第一次看的地方再记录一下-- 1.预处理器读入源代码,根据预处理指令对其进行修改,然后将修改后的源代码交给编译器. 2. ...