http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19469
題意:給你兩個字符串,問你最短的能將這兩個字符串作爲子序列的序列的長度與數量。
分析:標準的LCS題,兩個字符串長度和減去LCS長度即可。
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
#define INF 0x3f3f3f3f
const int N=10005;
const int mod=1e9+7;
int d[35][35];
long long s[35][35];
string s1,s2;
int main() {
int t;
cin>>t;
getchar();
int kase=0;
while (t--) {
kase++;
getline(cin, s1);
getline(cin, s2);
memset(d, 0, sizeof(d));
memset(s, 0, sizeof(s));
int len1=s1.length(),len2=s2.length();
for (int i=0; i<=len1; i++) {
s[i][0]=1;
}
for (int i=0; i<=len2; i++) {
s[0][i]=1;
}
for (int i=1; i<=len1; i++) {
for (int j=1; j<=len2; j++) {
if (s1[i-1]==s2[j-1]) {
d[i][j]=d[i-1][j-1]+1;
s[i][j]=s[i-1][j-1];
} else {
if (d[i-1][j]>d[i][j-1]) {
d[i][j]=d[i-1][j];
s[i][j]=s[i-1][j];
} else if (d[i-1][j]<d[i][j-1]) {
d[i][j]=d[i][j-1];
s[i][j]=s[i][j-1];
} else {
d[i][j]=d[i-1][j];
s[i][j]=s[i-1][j]+s[i][j-1];
}
}
}
}
printf("Case #%d: %d %lld\n",kase,len1+len2-d[len1][len2],s[len1][len2]);
}
return 0;
}