poj1159 dp最长公共子串

 1 //Accepted    204 KB    891 ms
 2 //dp最长公共子串
 3 //dp[i][j]=max(dp[i-1][j],dp[i][j-1])
 4 //dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1) (s1[i]==s2[j])
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <iostream>
 8 using namespace std;
 9 const int imax_n = 5002;
10 int dp[2][imax_n];
11 char s1[imax_n];
12 char s2[imax_n];
13 int n;
14 int max(int a,int b)
15 {
16     return a>b?a:b;
17 }
18 void Dp()
19 {
20     memset(dp,0,sizeof(dp));
21     for (int i=1;i<=n;i++)
22     {
23         for (int j=1;j<=n;j++)
24         {
25             dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]);
26             if (s1[i-1]==s2[j-1])
27             dp[i%2][j]=max(dp[i%2][j],dp[(i-1)%2][j-1]+1);
28         }
29     }
30     printf("%d\n",n-dp[n%2][n]);
31 }
32 int main()
33 {
34     while (scanf("%d",&n)!=EOF)
35     {
36         scanf("%s",s1);
37         for (int i=0;i<n;i++)
38         s2[i]=s1[n-1-i];
39         s2[n]=‘\0‘;
40         Dp();
41     }
42     return 0;
43 }

poj1159 dp最长公共子串

时间: 2024-11-06 03:56:39

poj1159 dp最长公共子串的相关文章

一天一道算法题(5)---最长公共子串

题目 给定两个字符串str1和str2,返回两个字符串的最长公共子串.例如:str1="1AB2345CD",str2="12345EF",公共子串是"2345" 解析 最长公共子串和最长公共子序列的区别是,子串是连续的,子序列是不连续的. 首先还是要生成动态规划表.生成大小为M*N的矩阵dp.dp[i][j]的含义是,在必须把str1[i]和str2[j]当作公共子串最后一个字符的情况下,公共子串最长能有多长.比如,str1="A12

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,……,yn}为两个序列,并设Z={z1.z2.……,zk}为X和Y的任意一个LCS,则: (1)如果xm=

最长递增子序列 &amp;&amp; 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

http://www.cppblog.com/mysileng/archive/2012/11/30/195841.html 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增子序列. 设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为: dp[i] = max{dp[j]+1}, 1<=j<i,a[j]<a[i]. 这样简单的复杂度为O(n^2),其实还有更好的方

最长公共子序列和最长公共子串

子串就是要连在一起的,而子序列就是满足这同时在1-n的母串中存在就好了. 比如abcdefg 子串有abc 子序列acdfg 动态规划 假设Z=<z1,z2,?,zk>是X与Y的LCS, 我们观察到 如果Xm=Yn,则Zk=Xm=Yn,有Zk?1是Xm?1与Yn?1的LCS: 如果Xm≠Yn,则Zk是Xm与Yn?1的LCS,或者是Xm?1与Yn的LCS. 因此,求解LCS的问题则变成递归求解的两个子问题.但是,上述的递归求解的办法中,重复的子问题多,效率低下.改进的办法--用空间换时间,用数组

最长公共子串与最长公共子序列之间的关系

最近工作中需要写一个算法,而写完这个算法我却发现了一个很有意思的事情.需要的这个算法是这样的:对于A,B两个字符串,找出最多K个公共子串,使得这K个子串长度和最大.一开始想了一些乱七八糟的想法. 错误想法1:比如每次找最长公共子串,找到一个子串后,从A,B两个字符串中删除这个子串,之后在剩下的串中再找最长公共子串,像这样找K次.但是可惜是错误的. 举个反例: A=KABCDELMABCDEFGNFGHIJK B=KABCDEFGHIJK K=2 按照这种方式选取结果为:ABCDEFG+HIJK,

最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

http://www.cnblogs.com/zhangchaoyang/articles/2012070.html 把一个问题转换为若干个规模更小的子问题,并且都借助于一个二维矩阵来实现计算. 约定:字符串S去掉最后一个字符T后为S',T1和T2分别是S1和S2的最后一个字符. 则dist(S1,S2)是下列4个值的最小者: 1.dist(S1',S2')--当T1==T2 2.1+dist(S1',S2)--当T1!=T2,并且删除S1的最后一个字符T1 3.1+dist(S1,S2')--

动态规划系列【4】最长公共子串

对于两个字符串,请设计一个时间复杂度为O(m*n)的算法(这里的m和n为两串的长度),求出两串的最长公共子串的长度.这里的最长公共子串的定义为两个序列U1,U2,..Un和V1,V2,...Vn,其中Ui   + 1 == Ui+1,Vi + 1 == Vi+1,同时Ui == Vi. 给定两个字符串A和B,同时给定两串的长度n和m. 测试样例: "1AB2345CD",9,"12345EF",7 返回:4 题意:求最长公共子串.子串是连续的.子序列是不连续的. p

UVa 10192 - Vacation ( LCS 最长公共子串)

链接:UVa 10192 题意:给定两个字符串,求最长公共子串的长度 思路:这个事最长公共子串的直接应用 #include<stdio.h> #include<string.h> int max(int a,int b) { return a>b?a:b; } int main() { char s[105],t[105]; int i,j,k=0,m,n,dp[105][105]; while(gets(s)!=NULL){ if(strcmp(s,"#"

java 动态规划算法求解最长公共子串

最近在项目中碰到了这样的一个问题,要比较JS和CSS是否做了修改,先是想着借助第三方工具发现没找到,后面转念一想,这个问题不就是对两个文件的第一行求最大的公共子串嘛,既然是要求公共子串的最大长度,由此想到了动态规划算法. 代码是从网上C++改写过来的,感谢那位C++的兄弟,代码如下: package dp; /** * 用动态规划算法求解 最长公共子串 * @author * */ public class LCSSuffix { private static String getLCSLeng