1.题目编号:1002
2.简单题意:给出两个子串,依次比较子串得到两个子串相等的字符的最大长度,即最长公共子序列。
3.解题思路形成过程:在动态规划的专题,就想到用动态规划的方法去做,首先要找子问题,假设有两个字符串a=a0,a1,a2,...am-1,b=b0,b1,b2...bn-1。如果am-1==bn-1,则当前最长公共子序列为a0,a1,...am-2与b0,b1,b2...bn-2的最长公共子序列的长度加1;如果am-1!=bn-1,则最长公共子序列为max(a0,a1,...am-2与b0,b1,b2...bn-1的公共子序列,a0,a1...am-1和b0,b1,b2...bn-2的子序列)就得到递归表示:if(a[i-1]==b[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}
4.感悟:这种题就像是模板,一个会了,只要遇到题就想着找状态转移方程组=.=
5.AC的代码:
#include<iostream>
#include<cstring>
using namespace std;
char a[1000];
char b[1000];
int dp[1000][1000];
int max(int l,int s){
if (l>=s)
return l;
else
return s;
}
int main(){
while(cin>>a>>b){
int a1=strlen(a);
int b1=strlen(b);
memset(dp,0,sizeof(dp));
for(int i=1;i<a1+1;i++){
for(int j=1;j<b1+1;j++){
if(a[i-1]==b[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[a1][b1]<<endl;
}
return 0;
}
原题:
abcfbc abfcab programming contest abcd mnp
4 2 0