`
pleasetojava
  • 浏览: 730407 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ACM最长公共子序列问题(动态规划)C++实现

 
阅读更多

// 最长公共子序列问题.cpp : Defines the entry point for the console application.
//动态规划问题

对于X=x1x2...xm, Y=y1y2...yn的最长公共子序列Z=z1z2...zk

1)、如果xm=yn,那么zk=xm=yn,且Zk-1是Xm-1和Yn-1的一个LCS

2)、如果xm!=yn,那么zk!=xm蕴含Z是Xm-1和Y的一个LCS

3)、如果xm!=yn,那么zk!=yn蕴含Z是X和Yn-1的一个LCS

最长公共子序列的长度

#include "stdafx.h"
#include<iostream>
#define N 1000
using namespace std;
//str1存储字符串1,str2存储字符串2
char str1[N],str2[N];
//lcs存储最长公共子序列
char lcs[N];
//c[i][j]存储str1[1...i]与str2[1...j]的最长公共子序列的长度
int c[N][N];
//flag[i][j]标记是那种子问题
//flag[i][j]==0为str1[i]==str2[j]
//flag[i][j]==1为c[i-1][j]>=s[i][j-1]
//flag[i][j]==-1为c[i-1][j]<s[i][j-1]
int flag[N][N];

//
int getLCSlength(const char *s1, const char *s2)
{
int i;
int len1 = strlen(s1);
int len2 = strlen(s2);
for(i=1;i<=len1;i++)
c[i][0] = 0;
for(i=0;i<=len2;i++)
c[0][i] = 0;
int j;
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
if(s1[i-1]==s2[j-1])
{
c[i][j] = c[i-1][j-1] +1;
flag[i][j] = 0;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j] = c[i-1][j];
flag[i][j] = 1;
}
else
{
c[i][j] = c[i][j-1];
flag[i][j] = -1;
}
}
return c[len1][len2];
}

char* getLCS(const char *s1, const char *s2,int len,char *lcs)
{
int i = strlen(s1);
int j = strlen(s2);
while(i&&j)
{
if(flag[i][j]==0)
{
lcs[--len] = s1[i-1];
i--;
j--;
}
else if(flag[i][j]==1)
i--;
else
j--;
}
return lcs;
}

int _tmain(int argc, _TCHAR* argv[])
{
int cases;
cout<<"请输入案例的个数:"<<endl;
cin>>cases;
while(cases--)
{
int i;
cout<<"请输入字符串1:"<<endl;
cin>>str1;
cout<<"请输入字符串2:"<<endl;
cin>>str2;
int lcsLen = getLCSlength(str1,str2);
cout<<"最长公共子序列长度:"<<lcsLen<<endl;
char *p = getLCS(str1,str2,lcsLen,lcs);
cout<<"最长公共子序列为:"<<endl;
for(i=0;i<lcsLen;i++)
cout<<lcs[i];
cout<<endl;
}
system("pause");
return 0;
}

请输入案例的个数:
1
请输入字符串1:
abcbdab
请输入字符串2:
bdcaba
最长公共子序列长度:4
最长公共子序列为:
bcba
请按任意键继续. . .

分享到:
评论

相关推荐

    menyf#acm-icpc-template#最长公共子序列1

    最长公共子序列模版

    基于C++实现的ACM-ACM竞赛常用模板

    3. **动态规划**:背包问题、最长公共子序列、最长递增子序列等,这些问题在ACM中很常见。 4. **字符串处理**:KMP算法、Rabin-Karp字符串匹配、Z函数等,用于处理字符串相关问题。 5. **数学工具**:大整数运算、模...

    ACM资料字符串处理并差集

    这个问题可以使用动态规划算法来解决,我们可以使用二维数组来存储中间结果,并使用递归式来计算最长公共子序列的长度。 六、算法实现 在实际实现中,我们可以使用 C++、Java 等编程语言来实现 ACM 资料字符串处理...

    动态规划 ACM培训资料

    3. 最长子序列:比如PKU2533题目,找出两个字符串的最长公共子序列,同样可以通过动态规划求解。 在实际应用中,动态规划不仅能够解决理论上的问题,还能在很多实际场景下找到最优解决方案,例如资源分配、路径规划...

    动态规划详解

    动态规划不仅适用于背包问题,还常用于求解最短路径(如Dijkstra算法和Floyd-Warshall算法)、最长公共子序列、编辑距离、网络流问题等。它在图论、组合优化、人工智能等领域都有重要应用。 5. **学习资源** ...

    hdu acm 教案(3)

    7. **案例分析**:教案可能会包含一些经典的动态规划问题,如背包问题、最长公共子序列、最短路径问题(如Floyd-Warshall算法),通过具体案例帮助学生理解和应用动态规划。 8. **代码实现**:讲解如何用实际编程...

    ACM模板和一些题目的代码实现(基于C++源代码)

    在ACM竞赛中,动态规划常用于解决最优化问题,例如背包问题、最长公共子序列等。了解如何定义状态和转移方程是掌握动态规划的关键。 2. **图论**:图论是研究图的数学分支,ACM中涉及到的图论算法包括最短路径...

    ACM培训教材之动态规划+图论+组合数学+指针的运用

    在ACM中,动态规划常用于解决背包问题、最长公共子序列、最短路径等经典问题。了解并熟练掌握动态规划的核心在于理解状态转移方程,建立状态空间,以及选择合适的记忆化或自底向上的求解策略。 **图论(Graph ...

    ACM-ICPC竞赛过程中学习、总结并实现的编程技巧、算法,主要基于C++实现。.zip

    可能包含经典DP问题的模板代码,如背包问题、最长公共子序列、最短路径等。 4. **贪心策略**:在某些问题中,局部最优解能导致全局最优解。贪心算法的实现可能涵盖区间调度、任务分配等问题。 5. **回溯法与剪枝**...

    杭电ACM解题报告(C/C++)

    - 最长公共子序列、最长递增子序列:经典DP应用,解决字符串处理问题。 4. **贪心算法(Greedy Algorithm)** - 活动安排、区间调度:选择当前最优解,逐步达到全局最优。 - Kruskal's和Prim's算法:贪心策略...

    杭电acm源程序学习--c/c++

    典型的动态规划问题有背包问题、最长公共子序列等。理解和编写动态规划代码需要具备良好的问题分析和状态转移矩阵构建能力。 6. **并查集** 并查集是一种数据结构,用于处理集合的合并与查询问题,常用于解决图论...

    LIS.cpp.tar.gz_Help!_LIS acm_lis

    此外,解决LIS问题的代码也可以用于其他类似的问题,比如最长公共子序列等。 总之,这个压缩包包含了一个用于解决ACM竞赛中LIS问题的C++代码,它通过动态规划和可能的二分查找技术来找到最长递增子序列。如果你在...

    动态规划经典教程doc.pdf

    文档《动态规划经典教程doc.pdf》是一份关于动态规划(Dynamic ...动态规划的经典题型通常包括背包问题、最长公共子序列、最长递增子序列、最长公共子串等,通过解决这些问题,可以加深对动态规划方法的理解和应用。

    suanfa.rar_ACM_acm 算法_visual c

    在ACM竞赛中,动态规划常用于处理有重叠子问题和最优子结构的问题,如背包问题、最长公共子序列、斐波那契数列等。动态规划的核心思想是记忆化,即保存已解决子问题的结果,避免重复计算,提高效率。在Visual C++中...

    Common sequeence

    在这个ACM源码中,我们看到一个二维数组 `num[i][j]`,它通常用于存储两个字符串(长度分别为i和j)的最长公共子序列的长度。 代码首先定义了变量 `n`,表示字符串的数量,然后创建了一个大小为n×n的二维数组 `num...

    杭电ACM 200多道基础题代码,C++编写

    常见的算法包括排序(如冒泡排序、快速排序、归并排序、堆排序)、搜索(如二分查找、深度优先搜索、广度优先搜索)、图论(如...动态规划(如斐波那契序列、背包问题、最长公共子序列)、字符串处理(如KMP算法、Rabin...

    acm资料汇总

    3. **动态规划**:学习如何通过状态转移方程来解决具有重叠子问题和最优子结构的问题,如斐波那契数列、背包问题、最长公共子序列等。 4. **贪心算法**:针对问题的部分最优解进行求解,例如活动选择问题、霍夫曼...

    acm竞赛重要参考资料

    这个主题通常包括状态定义、状态转移方程、记忆化搜索等方面,理解并熟练运用动态规划能够解决许多复杂的问题,如最长公共子序列、最短路径等。 “母函数_7805275.ppt”涉及组合数学中的一个重要工具,母函数在求解...

    ACM之路的计划

    * 动态规划:15 题以上,包括最大子串和、最长公共子序列、最长单调递增子序列等 * 算法设计与分析:学会分析与计算复杂程序的时间复杂度、使用栈与队列等线性存储结构、分治策略 * 排序算法:归并排序、快速排序、...

Global site tag (gtag.js) - Google Analytics