动态规划解最大公共子串
2013-12-19 09:42
344 查看
子串是连续的
一:刻画最优解结构特征
用c[i,j]表示以a[i],b[j]结尾的最大公共子串中的字符数。则max(c[i,j]) (0<=i<=len(a)-1, 0<=j<=len(b)-1)表示a和b最大公共子串的字符数。同时在求解过程中可以确定i和j,这样也就确定了这个公共子串。
二:递归定义最优解的值
c[i,j]=c[i-1,j-1]+1, (a[i] = b[j])
c[i,j] = 0, (a[i]<>b[j])
三:自底向上的方法
i和j递增
四:构造最优解
确定i,j和c[i,j],也就能反推出最大公共子串
代码如下:
#include<iostream>
using namespace std;
#define max(x,y) ((x)>(y)?(x):(y))
int main()
{
int a[5] = {13,16,2,45,3};
int b[10] = {4,5,2,7,16,2,45,6,7,3};
int c[5][10];
memset(&c, 0, sizeof(c));
int q = -1;
for(int i = 0; i<5; i++)
{
for(int j =0; j<10; j++)
{
if(a[i]==b[j])
{
c[i][j] = c[i-1][j-1] + 1;
}
else
{
c[i][j] = 0;
}
q = max(q,c[i][j]);
}
}
cout<<q<<endl;
return 0;
}
一:刻画最优解结构特征
用c[i,j]表示以a[i],b[j]结尾的最大公共子串中的字符数。则max(c[i,j]) (0<=i<=len(a)-1, 0<=j<=len(b)-1)表示a和b最大公共子串的字符数。同时在求解过程中可以确定i和j,这样也就确定了这个公共子串。
二:递归定义最优解的值
c[i,j]=c[i-1,j-1]+1, (a[i] = b[j])
c[i,j] = 0, (a[i]<>b[j])
三:自底向上的方法
i和j递增
四:构造最优解
确定i,j和c[i,j],也就能反推出最大公共子串
代码如下:
#include<iostream>
using namespace std;
#define max(x,y) ((x)>(y)?(x):(y))
int main()
{
int a[5] = {13,16,2,45,3};
int b[10] = {4,5,2,7,16,2,45,6,7,3};
int c[5][10];
memset(&c, 0, sizeof(c));
int q = -1;
for(int i = 0; i<5; i++)
{
for(int j =0; j<10; j++)
{
if(a[i]==b[j])
{
c[i][j] = c[i-1][j-1] + 1;
}
else
{
c[i][j] = 0;
}
q = max(q,c[i][j]);
}
}
cout<<q<<endl;
return 0;
}
相关文章推荐
- 2017年A组蓝桥杯(最大公共子串问题)【动态规划】
- 最大公共子串(动态规划)
- 第八届蓝桥杯 最大公共子串(动态规划)
- 动态规划解最大公共子串
- 蓝桥杯 最大公共子串长度 动态规划 dp
- 最大子序列、最长连续公共子串(连续)、最长公共子序列(动态规划)
- 动态规划:求最大公共子串
- 2017-年蓝桥杯C-(A组)赛题-动态规划-最大公共子串
- 最大公共子串--动态规划
- 动态规划——最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串最小编辑距离日记整理
- 蓝桥杯java第八届B组:最大公共子串
- 动态规划求解最长公共子串
- 编程实现查找两个字符串的最大公共子串 示例:"aocdfe"和"pmcdfa"最大公共子串为"cfd"
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 找出两个字符串的最大公共子串
- 算法作业6 动态规划 - 最长公共子串问题
- 动态规划解决最大子串和的源代码
- [置顶] 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离总结
- 第八届 6.最大公共子串