动态规划之最长公共子串问题

最长公共子串问题:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列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  听了一首 你要的不是我 ,有些怀念高三的时候,还有那些歌,那些人,那些事。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值