HDU 1159 Common Subsequence
题目大意:给定两个字符串,求他们的最长公共子序列的长度
解题思路:设字符串 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的更多相关文章
- HDU 1159 Common Subsequence 最长公共子序列
HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...
- HDU 1159 Common Subsequence 公共子序列 DP 水题重温
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- hdu 1159 Common Subsequence(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- hdu 1159 Common Subsequence(最长公共子序列 DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- HDU 1159 Common Subsequence(裸LCS)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- HDU 1159 Common Subsequence【dp+最长公共子序列】
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1159 Common Subsequence 【LCS 基础入门】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1159 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 1159:Common Subsequence(动态规划)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1159 Common Subsequence(LCS最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
随机推荐
- C++string的操作
#include <iostream> using namespace std; int main() { //initilization string str("abc.ddd ...
- 兼容 IE,firfox 的时间日期出现 NaN
//当前日期加上天数后的新日期.function AddDays(days) { var d = new Date(); var year = d.getFullYear(); var day = ...
- 【C语言学习】-05 二维数组、字符串数组、多维数组
⼆二维数组.字符串数组.多维数组
- POJ 2559 Program C
Submit Status Practice POJ 2559 Description A histogram is a polygon composed of a sequence of recta ...
- ppurl
ppurl 就这么挂了?? 简直不敢相信 我才刚上不久,它竟然就这么挂啦??? 还是转到哪了? 有人知道吗? 表示我很愤怒,就好像当年新浪爱问共享就这么挂了一样 过了很久我才知道原来它转到新浪微盘了. ...
- C/C++文件结构
总结者:kate (1).h 为头文件:存放 版权和版本声明,预处理块 ,函数和类结构声明 (2).cpp文件:代码文件,存放程序的实现 大都数时候,源文件和头文件是对应出现的,比如有一个A.cpp ...
- 移动设备和SharePoint 2013 - 第4部分:定位
博客地址:http://blog.csdn.net/foxdave 原文地址 在该系列文章中,作者展示了SharePoint 2013最显著的新功能概观--对移动设备的支持. 该系列文章: 移动设备和 ...
- poj1125(Floyd最短路)
//Accepted 164 KB 0 ms //floyd #include <cstdio> #include <cstring> #include <iostrea ...
- POJ 3156 - Interconnect (概率DP+hash)
题意:给一个图,有些点之间已经连边,现在给每对点之间加边的概率是相同的,问使得整个图连通,加边条数的期望是多少. 此题可以用概率DP+并查集+hash来做. 用dp(i,j,k...)表示当前的每个联 ...
- windows8.1 plsql连接oracle
http://pan.baidu.com/share/link?shareid=3782452820&uk=3557941237 http://pan.baidu.com/share/link ...