POJ

来源:互联网 发布:西门子plc300仿真软件 编辑:程序博客网 时间:2024/05/01 22:09

题意

让我们求两个字符串中最长的公共子串是多大

分析

最优化问题
考虑dp
我们看两个字符串如何定义解的结构
假设f(i,j)求出长度为i的串a和长度为j的串b的LCS
两个字符串中的LCS 其实就相当于
判断两个字符串最后的那个字符是否相同
如果相同那么我们就用1+f(lena-1,lenb-1)
如果不同我们就需要取f(lena-1,lenb)和f(lena,lenb-1)中的MAX
所以对于新的f()问题 我们可以递归构建解
可是不如迭代爽!!
所以我们可以尝试迭代搞
其实f(i,j)的结果就是f(i-1,j),f(i,j-1),f(i-1,j-1)组成的
我们不妨把递归改成两层for循环
ij都从1开始枚举
不断判断我们刚才确定的递推关系

code

#include<bits/stdc++.h>using namespace std;int dp[1010][1010];char a[1010],b[1010];int main(){    while(~scanf("%s%s",a+1,b+1))    {        int la =strlen(a+1),lb = strlen(b+1);        for(int i=1;i<=la;i++){            for(int j=1;j<=lb;j++){                if(a[i]==b[j])                    dp[i][j] = max(dp[i][j],dp[i-1][j-1]+1);                else                     dp[i][j] = max(dp[i-1][j],dp[i][j-1]);//              cout<<dp[i][j]<<" ";            }//          cout<<endl;        }        printf("%d\n",dp[la][lb]);         memset(dp,0,sizeof(dp));     }return 0;} 
原创粉丝点击