Common Subsequence
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 37077 Accepted Submission(s): 16977
The program input is from a text file. Each data set in the file contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct. For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.
給你兩串字符串,求出最長的相同序列,此序列不一定相鄰,如所給例子一,最長相同序列爲 abfc。
解題思路:
DP的類型題,狀態轉移方程很巧妙,給當前的兩個字符串都加一個字符:
①如果兩個字符不一樣,那麼對原來的狀態沒有改變,最長長度爲備選的兩個 ”最長子序列 “中較長的那個。
②如果兩個字符都一樣,那麼“最長子序列”是之前的“最長子序列”長度+1。
即:
dp[i][j]=dp[i-1][j-1]+1;(a[i]==b[j])
dp[i][j]=max(dp[i-1][j],dp[i][j-1])(a[i]!=b[j]);
(PS:把兩個數組分別作爲行列建立二維數組可能會更直觀一些,最後二維數組最右下角的值一定是最大值!)
代碼如下:
#include<cstdio>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
string a,b;
int dp[1001][1001];
int DP();
int main()
{
while(cin>>a>>b)
{
memset(dp,0,sizeof(dp));
printf("%d\n",DP());
}
return 0;
}
int DP()
{
int hang = a.length();
int lie = b.length();
for(int i=0 ; i<hang ; i++)
{
for(int j=0 ; j<lie ; j++)
{
if(a[i]==b[j]) dp[i+1][j+1] = dp[i][j]+1;
else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
}
}
return dp[hang][lie];
}
題目傳送門。。。。。