首页 > 编程知识 正文

动态规划算法的基本步骤,最长子序列问题

时间:2023-05-05 04:42:39 阅读:136014 作者:57

问题说明:

输入格式:

两行、每行表示一个字符串,分别表示一个DNA序列。 每个字符串的长度不超过1000。

输出格式:

一个数,最长的公共子序列元素的数量。

输入样本:

这里显示一组输入。 例如:

AGCT

ATT

输出样本:

在这里输出适当的输出。 例如:

2

分析:首先,你需要了解子序列的概念是什么。 那是从一个序列中去除0或多个元素的结果。 必须强调的是,子序列并不一定是连续的,也可能是不连续的。 主题中的最长公共子序列是AT。 用动态规划解决问题,首先要找到递推关系式,并在此基础上自下而上地进行编程

这就是这个问题的递归关系式,其中C[i,j]表示长度为I和长度为j的2个系列的最长共同部分系列的长度,依赖于比其小的部分问题。

有了递推关系式,就能编程

应该注意的地方已经注释了

# includeiostreamusingnamespacestd; #define MAX 1002string a,b; int dp[MAX][MAX]={0}; int main () { cinab; for(intI=1; i=a.length (; I )//请注意,此处的I和j都从1开始。 因为最小的数组长度为1for(intj=1)。 j=b.length (; j ) if(a[i-1]==b[j-1] ) /其中I-1和j-1是比较两个字符串的第一个元素,然后是第二个. a.length ) -一个元素DP [ I ] [ j ]=DP [ I ] else dp[i][j]=dp[i][j-1]; }}coutDP[a.length(][b.length ) ]; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。