abcfbc abfcab programming contest abcd mnp
4 2 0
Southeastern Europe 2003
這道題就是求最大公共子序列的長度。
不知道怎麼解釋。
只好打了個草圖。
#include#include #define max(a,b) a>b?a:b char s[520]; char s1[520]; int lcs[520][520]; int LCS(int l,int l1) { int i,j; //將兩列字符竄變成i行,j列。lsc數組代表每一個位置的最大公共子序列的長度。 for(i=1;i<=l;i++) for(j=1;j<=l1;j++) //將s[i-1]分別和s1的每一個元素做比較 { if(s[i-1]==s1[j-1]) //碰到相等的。 lcs[i][j]=lcs[i-1][j-1]+1;//圖中加一的情況 else lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);//碰到不相等的,則取它的上方和左方的那個的最大值,圖中都為一。以此累加 } return lcs[l][l1]; //到達最後的狀態必然是最大的長度,圖中的長度為2,最大公共子序列可以是ca或者ab。 } int main() { while(scanf("%s%s",s,s1)!=EOF) { int l=strlen(s); int l1=strlen(s1); memset(lcs,0,sizeof(lcs)); printf("%d\n",LCS(l,l1)); } return 0; }