求一个最短序列,使得输入的两个串的均为他的子序列,同时输出方案数。
n+m-LCS
方案数转移时求
#include <iostream>
#include <cstring>
using namespace std;
#define int long long
int n,m;
char a[102],b[102];
int f[102][102],cnt[102][102];
signed main(){
int i,j,T,cas=0;
cin>>T;
getchar();
while(T--){
gets(a+1);gets(b+1);
n=strlen(a+1),m=strlen(b+1);
f[0][0]=0; cnt[0][0]=1;
for(i=1;i<=n;i++)
f[i][0]=0,cnt[i][0]=1;
for(j=1;j<=n;j++)
f[0][j]=0,cnt[0][j]=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
if(a[i]==b[j])
f[i][j]=f[i-1][j-1]+1,
cnt[i][j]=cnt[i-1][j-1];
else{
if(f[i][j-1]>f[i-1][j])
f[i][j]=f[i][j-1],
cnt[i][j]=cnt[i][j-1];
else if(f[i][j-1]<f[i-1][j])
f[i][j]=f[i-1][j],
cnt[i][j]=cnt[i-1][j];
else
f[i][j]=f[i-1][j],
cnt[i][j]=cnt[i][j-1]+cnt[i-1][j];
}
}
cout<<"Case #"<<++cas<<": "<<n+m-f[n][m]<<" "
<<cnt[n][m]<<endl;
}
}
浙公网安备 33010602011771号