http://acm.hdu.edu.cn/showproblem.php?pid=1159点击打开链接
abcfbc abfcab programming contest abcd mnp
4 2 0
又是一个dp问题。
找到其动态方程,程序就出来了一大半了。我做dp 问题的时候习惯的画一个表格。
|
a |
b |
f |
c |
a |
b |
a |
1 |
1 |
1 |
1 |
1 |
1 |
b |
1 |
2 |
2 |
2 |
2 |
2 |
c |
1 |
2 |
2 |
3 |
3 |
3 |
f |
1 |
2 |
3 |
3 |
3 |
3 |
b |
1 |
2 |
3 |
3 |
3 |
4 |
c |
1 |
2 |
3 |
4 |
4 |
4 |
有了这个 dp 方程就好理解了:
当 a[ i ] ==b[ i ] 时: dp[ i ][ j ]=dp[ i-1 ][ j-1 ] +1;
当 a[ i ] !=b[ i ] 时: max( dp[ i-1 ][ j ] , dp[ i ][ j-1 ] ).
下面就是代码了:
#include<iostream> #include<string.h> using namespace std; #define M 505 #define max(a,b) a>b?a:b int dp[M][M]; int main() { int lena,lenb,i,j; char a[M],b[M]; for(i=0;i<M;i++) //初始化 dp[0][i]=dp[i][0]=0; while(cin>>a+1>>b+1) //从 a[1],b[1] 开始输入 { lena=strlen(a)-1; lenb=strlen(b)-1; for(i=1;i<=lena;i++) { for(j=1;j<=lenb;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]); } } cout<<dp[lena][lenb]<<endl; } return 0; }