题目描述

输入两个01串,输出它们的最长公共子序列的长度

输入输出格式

输入格式:

一行,两个01串

输出格式:

最长公共子序列的长度

输入输出样例

输入样例#1: 复制

01010101010 00000011111
输出样例#1: 复制

6

说明

01串长度≤10000

数据好水啊

一开始想了一个dp[i]表示以b中到达i位置最长的LCS,f[i]表示他的位置,然后转移就好,不过这样只能处理LCS是从1开始的情况

比如

01110

101100这个数据就过不去了,

然而。。

我得了90.。。。。。。。

后来加了个特判就A了,

时间复杂度严格O(la+lb)

速度保证全洛谷rank1:joy:

                         #include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=;
inline char nc()
{
static char buf[MAXN],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,MAXN,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
char c=nc();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=nc();}
while(c>=''&&c<=''){x=x*+c-'';c=nc();}
return x*f;
}
inline int work(int x)
{
int ans=;
for(int i=;i<x;i++)
if(x%i==) ans+=i;
return ans;
}
int dp[MAXN];//i位置的长度
int f[MAXN];//i位置所对应的位置
char a[MAXN],b[MAXN];
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
scanf("%s",a+);
scanf("%s",b+);
int la=strlen(a+),lb=strlen(b+);
for(int i=;i<=lb;i++)
{
dp[i]=dp[i-];
f[i]=f[i-];
for(int j=f[i-]+;j<=la;j++)
{
if(b[i]==a[j])
{
dp[i]=dp[i]+;
f[i]=j;
break;
}
}
}
if(dp[lb]==&&lb>=) printf("");
else printf("%d",dp[lb]);
return ;
}

xjb贪心

正解是裸地LCS

不过按理说O(n^2)的应该过不去

数据太水了没办法

注意滚动数组

                        #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=;
inline char nc()
{
static char buf[MAXN],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,MAXN,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
char c=nc();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=nc();}
while(c>=''&&c<=''){x=x*+c-'';c=nc();}
return x*f;
}
inline int work(int x)
{
int ans=;
for(int i=;i<x;i++)
if(x%i==) ans+=i;
return ans;
}
int dp[][MAXN];//i位置的长度
char a[MAXN],b[MAXN];
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
scanf("%s",a+);
scanf("%s",b+);
int la=strlen(a+),lb=strlen(b+);
for(int i=;i<=la;i++)
for(int j=;j<=lb;j++)
if(a[i]==b[j])
dp[i^][j]=dp[(i-)^][j-]+;
else dp[i^][j]=max(dp[(i-)^][j],dp[i^][j-]);
printf("%d",dp[la^][lb]);
return ;
}

最新文章

  1. SharePoint 2013 文档上传的多种形式
  2. 4. 什么是AJAX
  3. Android中运行的错误:java.lang.UnsatisfiedLinkError: Couldn&#39;t load locSDK3: findLibrary returned null.
  4. node exports与 module.exports的区别
  5. MongoDB的增删改查 转
  6. Python应用与实践【转】
  7. HW6.25
  8. springmvc的讲解
  9. GridView控件中插入自定义删除按钮并弹出确认框
  10. ASP.NET上传大文件出现网页无法显示的问题
  11. itextsharp c# asp.net 生成 pdf 文件
  12. 8.23.3 IO-转换流的作用
  13. PL/SQL 记录 Record 简介
  14. 【重点--web前端面试题总结】
  15. 使用交互式方式在SQL server2017上创建数据库
  16. css 块元素、内联元素、内联块元素
  17. apm固定翼调试方法
  18. Could not initialize class utils.JdbcUtils
  19. Centos7关闭防火墙
  20. package-lock.json和package.json区别

热门文章

  1. 洛谷—— P2934 [USACO09JAN]安全出行Safe Travel || COGS ——279|| BZOJ——1576
  2. iOS App 上架流程
  3. Trie树的常见应用大总结(面试+附代码实现)
  4. Hadoop2.2集群安装配置-Spark集群安装部署
  5. POJ 1895 分层图网络流+输出路径
  6. Gym - 100203H Highways 最小生成树
  7. rowcount和@@rowcount的区别
  8. JS 引擎基础之 Shapes and Inline Caches
  9. Comput_picture
  10. Maven学习总结(19)——深入理解Maven相关配置