C++练习 | 最长公共字符串(DP)
HDU 1159.Common Subsequence
#include<iostream> #include<stdio.h> #include<string> #include<cstring> #include<string.h> using namespace std; int dp[10007][10007];//a的前i个字母与b的前j个字母的有序交集长度 int main() { // freopen("01.in","r",stdin); string a,b; while(cin>>a>>b) { int m=a.length(); int n=b.length(); dp[0][0]=0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(a[i]==b[j]) { if(j!=0&&i!=0) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=1; } else { if(j!=0&&i!=0) { dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } else if(i==0) { dp[i][j]=max(0,dp[i][j-1]); } else { dp[i][j]=max(0,dp[i-1][j]); } } } } cout<<dp[m-1][n-1]<<endl; } return 0; }
零点处理有些过于麻烦了,可以通过更改i,j初始值简化,但是懒得改了
不算太明白以后再看看