最长公共子串问题:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子串就是求给定两个序列的一个最长公共子序列。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
刚写完0-1背包问题,感觉有些细节还是不是太清楚,又看了这题,感觉收获很大。
在草稿纸上写了循环内部的过程,写了一满版。
动态规划后一个状态依赖前一个状态的决策,用一个二重循环从小到大、从简单到复杂模拟了每个决策的过程结果,并把“价值”保存起来。
最后再将我们需要的状态的“价值”提取出来。
#include <iostream>
#include <string>
#define Max 100
using namespace std;
int max(int a,int b)
{
return a>b?a:b;
}
int a[Max][Max];
int fun(string s1,string s2)
{
int i,j;
for(i=1;i<=s1.length();i++)
{
for(j=1;j<=s2.length();j++)
{//a数组代表 前i个s1和前j个s2字符相等的个数
if(s1[i-1]==s2[j-1])//当前的字符是第i个和第j个,下标是i-1,j-1
a[i][j]=a[i-1][i-1]+1;//当前的字符相等,在前i-1个字符的基础上+1
else{
a[i][j]=max(a[i-1][j],a[i][j-1]);
//这里为什么要取这两个的最大值,我思考了很久,类似于这种例子吧
//s1=BCDE,S2=CD,当i=4,j=2的时候,指向的是s1的‘E’和s2的‘D’,这时的a[i][j]=2
}
}
}
return a[s1.length()][s2.length()];
}
void main()
{
string s1,s2;
cin>>s1>>s2;
cout<<fun(s1,s2)<<endl;
}
结果就不贴了。
这篇写了我很多我现在的想法,或许有的不对吧,我还会去看这算法的,有什么不对的地方,欢迎指正。谢谢
-----2013-12-11 晚21:14 听了一首 你要的不是我 ,有些怀念高三的时候,还有那些歌,那些人,那些事。