思路:求长度最少的串的思想和求最长公共子串基本一致,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;
}