Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 46139 | Accepted: 18919 |
Description
Input
Output
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
题意:求最大相同非连续的字符串(连续的就是KMP了)
两种方法:
第一种,就是单纯的dp,没有加任何修饰
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[500][500]; char str1[500],str2[500]; int main() { while(scanf("%s%s",str1,str2)!=EOF) { int len1=strlen(str1); int len2=strlen(str2); for(int i=0;i<=len1;i++) for(int j=0;j<=len2;j++) a[i][j]=0; for(int i=0;i<len1;i++) for(int j=0;j<len2;j++) if(str1[i]==str2[j]) a[i+1][j+1]=a[i][j]+1; else a[i+1][j+1]=max(a[i][j+1],a[i+1][j]); printf("%d\n",a[len1][len2]); } return 0; }
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char a[500],b[500]; int dp[2][500]; int main() { while(scanf("%s%s",a,b)!=EOF) { int len_a=strlen(a); int len_b=strlen(b); memset(dp,0,sizeof(dp)); for(int i=1;i<=len_a;i++) for(int j=1;j<=len_b;j++) if(a[i-1]==b[j-1]) dp[i%2][j]=dp[(i-1)%2][j-1]+1; else dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]); printf("%d\n",dp[len_a%2][len_b]); } return 0; }