求一个最短序列,使得输入的两个串的均为他的子序列,同时输出方案数。
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; } }
标签:cnt,int,Cyborg,Genes,102,UVA,strlen From: https://www.cnblogs.com/towboa/p/17291225.html