10723 (最長公共子序列變形)
阿新 • • 發佈:2018-12-11
思路:求長度最少的串的思想和求最長公共子串基本一致,dp[i][j]即可。
求數量,則藉助於前面的dp[i][j]。
具體思路看程式碼:
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int N = 40; char str1[N],str2[N]; int dp[N][N],num[N][N]; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int T ,cas = 0; scanf("%d", &T); getchar(); while(T--) { gets(str1); gets(str2); int len1 = strlen(str1), len2 = strlen(str2); memset(dp,0,sizeof(dp)); memset(num,0,sizeof(num)); for(int i = 1; i < N; i++) { dp[i][0] = dp[0][i] = i; num[i][0] = num[0][i] = 1; } num[0][0]=1; for(int i=0;i<len1;i++) { for(int j=0;j<len2;j++) { if(str1[i]==str2[j]) { dp[i+1][j+1]=dp[i][j]+1; num[i+1][j+1]=num[i][j]; } else { dp[i+1][j+1]=min(dp[i+1][j],dp[i][j+1])+1; if(dp[i+1][j]>dp[i][j+1]) { num[i+1][j+1]=num[i][j+1]; } else if(dp[i][j+1]>dp[i+1][j]) { num[i+1][j+1]=num[i+1][j]; } else { num[i+1][j+1]=num[i+1][j]+num[i][j+1]; } } } } printf("Case #%d: %d %d\n",++cas,dp[len1][len2],num[len1][len2]); } return 0; }