POJ 1458 Common Subsequence (zoj 1733 ) LCS
2024-08-31 18:20:47
POJ:http://poj.org/problem?id=1458
ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=733
HDU: http://acm.hdu.edu.cn/showproblem.php?pid=1159
题目大意:
给定两串子序列,求最长的公共字串(LCS)
设d( i , j)为A和 B的LCS的长度,则当A[i] = B[j]时, d(i , j)= d(i-1, j-1)+1 ; 否则 d (i , j)=max ( d(i - 1 ,j) , d(i , j-1 )},时间复杂度为O(nm),n和m分别为序列A和B的长度。
可用滚动数组优化空间复杂度。
下面给出不用和用滚动数组的。
空间未用滚动数组优化版本。。。。
#include<cstdio>
#include<cstring>
const int MAXN=512;
char a[MAXN],b[MAXN];
int dp[MAXN][MAXN];
int main()
{
while(~scanf("%s%s",a+1,b+1))
{
memset(dp,0,sizeof(dp));
int len_a=strlen(a+1);
int len_b=strlen(b+1);
for(int i=1;i<=len_a;i++)
{
for(int j=1;j<=len_b;j++)
{
if(a[i] == b[j])
dp[i][j]= dp[i-1][j-1]+1;
else
dp[i][j]= dp[i][j-1] > dp[i-1][j]? dp[i][j-1] : dp[i-1][j];
}
}
printf("%d\n",dp[len_a][len_b]);
}
}
滚动数组优化空间:
设dp1为前一列,dp2为后面一列。
#include<cstdio>
#include<cstring>
const int MAXN=512;
char a[MAXN],b[MAXN];
int dp1[MAXN],dp2[MAXN];
int main()
{
while(~scanf("%s%s",a+1,b+1))
{
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
int len_a=strlen(a+1);
int len_b=strlen(b+1);
for(int i=1;i<=len_a;i++)
{ for(int j=1;j<=len_b;j++)
{
if(a[i] == b[j])
dp2[j]= dp1[j-1]+1;
else
dp2[j]= dp2[j-1] > dp1[j]? dp2[j-1] : dp1[j];
} memcpy(dp1,dp2,sizeof(dp2)); }
printf("%d\n",dp1[len_b]);
}
}
最新文章
- Bootstrap 3 模态框播放视频
- ssh安装与配置
- 你的联动够快够小吗——基于Telerik(ASP.NET平台)
- Linux Linux程序练习八
- PV公式
- kindeditor编辑器
- Android的那些轮子
- jquery和highcharts折线图、柱形图、饼状图-模拟后台传參源代码
- Nancy
- 防止aspx木马的IIS SPY变态功能
- ArrayList源码解析(一)
- CentOS7安装MySQL的方法之RPM包方式
- 安装paramiko
- JAVA_SE基础——68.RunTime类
- mac相关功能
- 搜素表脚本.vbs
- Spring 入门知识点笔记整理
- Golang基础
- python各种post上传文件
- Windump教程-参数介绍
热门文章
- javaweb三、JDBC访问数据库
- col---过滤控制字符
- 洛谷——P2093 零件分组
- 《深入理解java虚拟机》学习笔记四/垃圾收集器GC学习/一
- [Angular] Make a chatbot with DialogFlow
- jquery表格简单插件
- UVa10397_Connect the Campus(最小生成树)(小白书图论专题)
- email之TO、CC、BCC意义
- 虚拟机上的企业网络管理系统(cisco works 2000安装配置)
- Codeforces 451 E. Devu and Flowers(组合数学,数论,容斥原理)