uva 10723 uva 10723 Cyborg Genes는 s1, s2의 가장 짧은 합렬 즉 합렬의 구성 방법수를 구한다

2192 단어
이미 알고 있는 두 개의 모열 s1, s2는 그것들의 가장 짧은 합열의 길이와 이 길이의 합열을 구성하는 방법수를 구하고 LCS로 풀다
dp[i][j]메모리 s1[i]와 s2[j]의 가장 짧은 합성 길이, dp[i][0]=dp[0][i]=i 초기화
1. s1[i]=s2[j]일 때 dp[i][j]=dp[i-1][j-1];
2. 그렇지 않으면 dp[i][j]=min(dp[i-1][j], dp[i][j-1]).
f[i][j]메모리 s1[i]와 s2[j]가 가장 짧은 열을 구성하는 방법, 초기 f[i][0]=f[0][i]=1,
1. 만약에 s1[i]=s2[j]는 마지막에만 놓을 수 있고 f[i][j]=f[i-1][j-1];
2. 서로 다르면 이때 새로 추가된 s1[i], s2[j]의 배치는 두 가지 상황이 있는데 하나는 s1[i]가 s2[j]의 뒤에 놓인 (f[i-1][j]), 다른 하나는 s1[i]가 s2[j]의 앞에 놓인 (f[i][j-1]), 즉 새로 추가된 마지막 문자의 앞이 s1[i]인지 s2[j]인지 고려해야 한다. 이때 어떤 배치법이 가장 작은 길이의 배치법인지 고려해야 한다. 만약에 s2[j]가 공공 문자열에 참여할 수 있다면 마지막에 놓인 s1[i]만 놓을 수 있다는 것을 알 수 있다.마찬가지로 s1[i]가 공공 문자열에 참여하면 s2[j]만 마지막에 놓을 수 있고 s1[i]와 s2[j]가 공공 문자열에 참여했는지 여부는 dp[i][j-1]과 dp[i-1][j]에서 반영할 수 있다. 만약에 s1[i]가 공공 문자열에 참여했는데 s2[j]가 없으면 dp[j][j-1]#include<stdio.h> #include<string.h> char s1[50],s2[50]; int dp[50][50],f[50][50]; int l1,l2; int min(int a,int b) { return a>b?b:a; } int main() { int i,j,k,l,m,n; scanf("%d",&l); for(k=1;k<=l;k++) { scanf("%s%s",s1+1,s2+1); l1=strlen(s1+1); l2=strlen(s2+1); for(i=0;i<50;i++) { dp[0][i]=dp[i][0]=i;// f[0][i]=f[i][0]=1; // } for(i=1;i<=l1;i++) { for(j=1;j<=l2;j++) { if(s1[i]==s2[j]) { dp[i][j]=dp[i-1][j-1]+1; f[i][j]=f[i-1][j-1]; } else { dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1; if(dp[i-1][j]==dp[i][j-1]) f[i][j]=f[i-1][j]+f[i][j-1]; else if(dp[i-1][j]<dp[i][j-1]) f[i][j]=f[i-1][j]; else f[i][j]=f[i][j-1]; } } } printf("Case #%d: %d %d
",k,dp[l1][l2],f[l1][l2]); } return 0; }

좋은 웹페이지 즐겨찾기