HDU 1159

  题目大意:给定两个字符串,求他们的最长公共子序列的长度

  解题思路:设字符串 a = "a0,a1,a2,a3...am-1"(长度为m), b = "b0, b1, b2, b3 ... bn-1"(长度为n),

       它们的最长公共子序列为c = "c0, c1, c2, ... ck-1",长度为k,

       dp[i][j]定义为子串 "a0,a1,...,ai-1" 和 子串"b0,b1,...,bj-1"的最长公共子序列,那么dp[m][n]即为所求结果。

       dp[i][j]即a的前i个字母和b的前j个字母的最长公共子序列

       

  接下来说明dp数组的更新过程,

         首先 dp[i][0] 和 dp[0][j]全部初始化为0: 其中有一个子串是空串,最长公共子序列自然为0

       

       若a,b的最后一个字母 am-1 == bn-1,则这个字母一定是c的最后一个字母(对公共子序列有贡献),即ck-1,

         那么 子串 "a0, ... am-2" 与 子串 “b0, ... bn-2”的最长公共子序列为 "c0, ... ck-2"(长度为k-1,加上最后一个字母也就是ck-1长度就是k)

       若 am-1 != bn-1, 有两种情况:

       <1>若am-1 != ck-1(公共子序列的最后一个字母),那么字母am-1对公共子序列就是没有贡献的,

         那么它们的最长公共子序列应该等于子串"a0,a1,a2, ..., am-2" 和 "b0,b1,b2, ..., bn-1"的最长公共子序列,即dp[m-1][n];

       <2>若bn-1 != ck-1, 那么字母bn对公共子序列就是没有贡献的,

         那么它们的最长公共子序列就应该等于子串"a0,a1,a2, ..., am-1" 和 子串 "b0, b1, b2, ... , bn-1"的最长公共子序列,即dp[m][n-1];

       因此考虑以上两种情况,若am-1 != bn-1时,取上面两种情况的最长公共子序列中较大的一个即为am-1 != bn-1时的结果

         即am-1 != bn-1时, 有 dp[m][n] = MAX(dp[m-1][n],  dp[m][n-1]);

  

  初始状态:  dp[0][i] 和 dp[i][0] = 0;

  状态转移方程:

       Ai == Bj时, dp[i][j] = dp[i-1][j-1]+1;

       Ai !=  Bj时, dp[i][j] = MAX(dp[i-1][j], dp[i][j-1]);

/* HDU 1159 Common Subsequence --- 入门dp */
#include <cstdio>
#include <cstring> int dp[][];
char s1[], s2[];
int len1, len2; inline int MAX(int a, int b){
return a > b ? a : b;
} /*
@function: 初始化工作
@param: void
@return: void
*/
void init()
{
len1 = strlen(s1);
len2 = strlen(s2);
for (int i = ; i < len1; ++i){
dp[][i] = ;
} for (int i = ; i < len2; ++i){
dp[i][] = ;
} } int main()
{
#ifdef _LOCAL
freopen("D:\\input.txt", "r", stdin);
#endif /*
定义状态dp[i][j]表示s1前i个字符和s2的前j个字符的最长公共子序列的长度
初始化: dp[i][0] 和 dp[0][j] 全初始化为0 (i <len1, j < len2)
状态转移方程:
s1[i] == s[j]时, dp[i][j] = dp[i-1][j-1]+1
s1[i] != s[j]时, dp[i][j] = MAX(dp[i-1][j], dp[i][j-1])
*/ while (scanf("%s%s", s1, s2) == ){
init(); for (int i = ; i <= len1; ++i){
for (int j = ; j <= len2; ++j){
//详细见状态转移方程
if (s1[i - ] == s2[j - ]){
dp[i][j] = dp[i - ][j - ] + ;
}
else{
dp[i][j] = MAX(dp[i - ][j], dp[i][j - ]);
}
}//for(j)
}//for(i)
printf("%d\n", dp[len1][len2]);
}
return ;
}

  

  相关链接:

  

   

HDU 1159 Common Subsequence的更多相关文章

  1. HDU 1159 Common Subsequence 最长公共子序列

    HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...

  2. HDU 1159 Common Subsequence 公共子序列 DP 水题重温

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  3. hdu 1159 Common Subsequence(最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  4. hdu 1159 Common Subsequence(最长公共子序列 DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  5. HDU 1159 Common Subsequence(裸LCS)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...

  6. HDU 1159 Common Subsequence【dp+最长公共子序列】

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. hdu 1159 Common Subsequence 【LCS 基础入门】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1159 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  8. hdu 1159:Common Subsequence(动态规划)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. hdu 1159 Common Subsequence(LCS最长公共子序列)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

随机推荐

  1. Highcharts导出gb2312乱码问题

    Highcharts是utf-8编码的,其本地的.net导出环境也是utf-8格式的,导致网页如果采用gb2312编码,显示正常,导出就乱码了.这种现象也同样经常出现在ajax的使用过程中. ajax ...

  2. C# Process打开程序并移动窗口到指定位置

    process.start只是按指定的参数来运行一个程序,而这个程序自己运行起来是什么样子的就不是Process所能处理的了,不过当程序运行起来后倒是可以通过Process的MainWindowHan ...

  3. HDU 4627 E(Contest #3)

    Description There are many unsolvable problem in the world.It could be about one or about zero.But t ...

  4. [转]Vimium快捷键

    from: http://www.cppblog.com/deercoder/archive/2011/10/22/158886.html 今天下午折腾了一下Chrome下面的一个插件Vimium的使 ...

  5. hadoop 常见问题

    1.Eclipse 读取hdfs文件错误:  java.io.IO Exception : Could not obtain block: blk_194219614024901469_1100 fi ...

  6. CPU MPU MCU SOC SOPC关系及区别

    在嵌入式开过程,会经常接触到一些缩写术语概念,这些概念在嵌入式行业中使用率非常高,下面我们就解释一下这些概念之间的关系和区别: 1.CPU(Central Processing Unit),是一台计算 ...

  7. Note_Master-Detail Application(iOS template)_01_YJYAppDelegate.h

    //YJYAppDelegate.h #import <UIKit/UIKit.h> @interface YJYAppDelegate : UIResponder <UIAppli ...

  8. IOS使用Asyncsocket进行socket编程

    iphone的标准推荐CFNetwork C库编程.但是编程比较烦躁.在其它OS往往用类来封装的对Socket函数的处理.比如MFC的CAsysncSocket.在iphone也有类似于开源项目.co ...

  9. php大力力 [025节] 来不及学习和分类的,大力力认为有价值的一些技术文章合集(大力力二叔公)(2015-08-27)

    php大力力 [025节] 来不及学习和分类的,大力力认为有价值的一些技术文章合集(大力力二叔公)(2015-08-27) 比较好的模版 免费模板网,提供大量DIV+CSS布局网页模板下载及后台管理 ...

  10. 数据结构 《2》----基于邻接表表示的图的实现 DFS(递归和非递归), BFS

    图通常有两种表示方法: 邻接矩阵 和 邻接表 对于稀疏的图,邻接表表示能够极大地节省空间. 以下是图的数据结构的主要部分: struct Vertex{ ElementType element; // ...