简单的一道题目,按照LCS的思想动态规划,同时注意相应的更新即可,具体实现见如下代码:
package a;//实际提交的时候记得去掉包名
import java.util.Arrays;
import java.util.Scanner;
public class Main {
int T;
String s1,s2;
long s[][]=new long[32][32];//s代表的是数量
long f[][]=new long[32][32];//f代表的是长度
public void Solve(){
Scanner scan=new Scanner(System.in);
T=scan.nextInt();
scan.nextLine();//去掉回车
int Case=0;
while(T>0){
T--;
s1=scan.nextLine();
s2=scan.nextLine();
int L1=s1.length();
int L2=s2.length();
for(int i=0;i<=L1;i++){
for(int j=0;j<=L2;j++){
s[i][j]=0;
f[i][j]=0;
}
}
for(int i=0;i<=L1;i++)
s[i][0]=1;
for(int j=0;j<=L2;j++)
s[0][j]=1;
for(int i=1;i<=L1;i++){
for(int j=1;j<=L2;j++){
if(s1.charAt(i-1)==s2.charAt(j-1)){
f[i][j]=f[i-1][j-1]+1;
s[i][j]=s[i-1][j-1];
}
else if(f[i-1][j]>f[i][j-1]){
f[i][j]=f[i-1][j];
s[i][j]=s[i-1][j];
}
else if(f[i-1][j]<f[i][j-1]){
f[i][j]=f[i][j-1];
s[i][j]=s[i][j-1];
}
else{
f[i][j]=f[i][j-1];
s[i][j]=s[i-1][j]+s[i][j-1];
}
}
}
Case++;
System.out.printf("Case #%d: %-1d %-1d\n",Case,L1+L2-f[L1][L2],s[L1][L2]);
}
}
public static void main(String[] args){
Main a=new Main();
a.Solve();
}
}