最长公共子序列
来源:互联网 发布:房产经纪人签单软件 编辑:程序博客网 时间:2024/05/02 00:34
算法原理参考 http://blog.csdn.net/v_july_v/article/details/6695482
ZOJ1733 基础题无疑
DP[i][j]存放的是对于A字符串和B字符串,当A到达 i 和B到达j 时,最大公共字符串的长度。我们定义temp,如果A的第i个字符和B的第j个字符相等,则temp为1,否则为0。则对于DP[i][j],到达DP[i][j]的可能有三个,即从DP[i-1][j], DP[i-1][j-1], dp[i][j-1]到达。所以DP[i][j]=max(DP[i-1][j-1]+temp,DP[i][j-1],DP[i-1][j])。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAXN 1001char a[MAXN],b[MAXN];int dp[MAXN][MAXN];int max3(const int &a,const int &b,const int &c){int temp=max(a,b);temp=max(temp,c);return temp;}int main(){ while(cin>>a>>b) { int t,i,j; memset(dp,0,sizeof(dp)); int len1=strlen(a); int len2=strlen(b); for(i=1;i<=len1;i++) { for(j=1;j<=len2;j++) { t=(a[i-1]==b[j-1])?1:0; dp[i][j]=max3(dp[i-1][j-1]+t,dp[i][j-1],dp[i-1][j]); } } printf("%d\n",dp[len1][len2]); } return 0;}
ZOJ1170
一开始用最长公共连续子序列写发现第三个本地案例错了= =
最长公共连续子序列参考: http://www.cnblogs.com/ErinCodeMM/archive/2012/10/30/2747042.html
我的代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int gcd(int n,int m){ if(n%m==0)return m; else gcd(m,n%m);}void yuefen(int a,int b)//a<b{ if(a==0)printf("0\n"); else if(a==b)printf("1\n"); else{ int t=gcd(a,b); printf("%d/%d\n",a/t,b/t); }}int main(){ // freopen("test.in","r",stdin); //freopen("test.out","w",stdout); char a[1001],b[1001]; while(~scanf("%s",a)) { if(a[0]=='-')break; scanf("%s",b); // printf("%s %s\n",a,b); int i,j,k; int lena=strlen(a); int lenb=strlen(b); // printf("%d %d\n",lena,lenb); int ma=0; int s; for(i=0;i<lena;i++) { k=i,j=0; s=0; while(k<lena&&j<lenb) { if(a[k]==b[j])s++; k++; j++; } if(s>ma)ma=s; } for(i=0;i<lenb;i++) { k=i;j=0; s=0; while(k<lenb&&j<lena) { if(a[j]==b[k])s++; k++; j++; } if(s>ma)ma=s; } printf("appx(%s,%s) = ",a,b); yuefen(ma*2,lena+lenb); } return 0;}
但是网上搜了一下题解是可以用最长公共连续子序列写的:
参考:http://blog.163.com/software_ark/blog/static/1756145942011330101437599/
关键代码:
for(i=0;i<lena;i++) //LCS表格的改进表生成 { for(j=0;j<lenb;j++) { if(a[i]==b[j]) { if(i>0&&j>0)num[i][j]=num[i-1][j-1]+1;//可以有间隔的连续 else num[i][j]=1;//i,j一旦有一个是0就要重新匹配 } else { if(i>0&&j>0)num[i][j]=num[i-1][j-1];//可以有间隔的连续 else num[i][j]=0;//i,j一旦有一个是0就要重新匹配 } max=max>num[i][j]?max:num[i][j]; } }学习了
0 0
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- POJ1976(01背包)t
- Struts2 Action 单例多例模式
- Delphi WebBrowser 无法调用当前浏览器的版本
- 一个男人写给媳妇的搞笑检讨书
- CORBA的简单介绍及HelloWorld
- 最长公共子序列
- nysql 5个子句的使用顺序
- 二分法查找数据
- 【Cocosd2d-x CCMenu菜单之二】
- 相对路径
- perl模块之Rex(本地安装)
- 利用+=n连续保存或者输出n个数
- 自定义控件专题之四:带3d翻转特效的滑动页
- 使用daemontools监控Zookeeper服务