Cyborg Genes UVA - 10723

发布时间 2023-04-05 22:53:50作者: towboat

求一个最短序列,使得输入的两个串的均为他的子序列,同时输出方案数。

 

 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;
    }
 }