http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=20480
LCS求最长公共子串
#include<stdio.h> #include<iostream> #include<map> #include<string.h> #include<vector> using namespace std; short a[5005][5005]; char s1[5005]; char s2[5005]; int LCS(const char *s1, const char *s2) { // s1:0...m, s2:0...n int m = strlen(s1), n = strlen(s2); int i, j; a[0][0] = 0; for( i=1; i <= m; ++i ) a[i][0] = 0; for( i=1; i <= n; ++i ) a[0][i] = 0; for( i=1; i <= m; ++i ) for( j=1; j <= n; ++j ) { if(s1[i-1]==s2[j-1]) a[i][j] = a[i-1][j-1]+1; else if(a[i-1][j]>a[i][j-1]) a[i][j]= a[i-1][j]; else a[i][j] = a[i][j-1]; } return a[m][n]; } int main() { int n; while(~scanf("%d",&n)) { memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); for(int i=0; i<n; i++) { cin>>s1[i]; } for(int i=0; i<n; i++) { s2[i]=s1[n-i-1]; } //cout<<s1<<" "<<s2<<endl; cout<<n-LCS(s1,s2)<<endl; } }
动态规划 注意short类型,不然会超内存;
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> using namespace std; short dp[5001][5001]; int main() { int k; char a[5001],b[5001]; while(~scanf("%d",&k)) { scanf("%s",a); int p=0; for(int i=k-1; i>=0; i--) { b[p]=a[i]; p++; } //for(int i=0; i<k; i++) // printf("%c%c",b[i],(i==(k-1))?'\n':' '); memset(dp,0,sizeof(0)); for(int i=1; i<=k; i++) for(int j=1; j<=k; j++) { if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } // printf("%d\n",dp[k][k]); printf("%d\n",k-dp[k][k]); } }