Search
Duplicate

LCS 2

생성일
2021/03/20 18:19
번호
9252
유형
dp

풀면서 막혔던 부분

LCS의 길이 를 구하는 것은 문제가 없었다. 이전에도 풀었던 문제였기 때문에 같은 방식으로 LCS의 길이 를 구했다. 그러나 문제는 LCS의 길이를 구한 이후 그 문자열을 다시 구하는것 이었다. 처음에는 0,0 의 인덱스에서 출발하여 저장된 값이 증가하는 부분들을 체크한 후 그 위치를 출력했으나 예외가 있었다. 그래서 DP배열의 끝부분에서 출발하여 구하니 풀 수 있었다.

코드

시간 : 4 ms

메모리 : 5816 KB

#include<bits/stdc++.h> int main() { char str1[1001]; char str2[1001]; char res[1001]; int dp[1001][1001]; for(int i=0;i<1001;i++){ str1[i] = 0; str2[i] = 0; dp[i][0] = 0; dp[0][i] = 0; } scanf("%s",str1); scanf("%s",str2); int i; int j; j = -1; int max = -1; while(str2[++j]){ i = -1; while(str1[++i]){ if (str2[j] == str1[i]) dp[j+1][i+1] = dp[j][i] + 1; else dp[j+1][i+1] = (dp[j][i+1] > dp[j+1][i]) ? dp[j][i+1] : dp[j+1][i] ; max = (max < dp[j+1][i+1]) ? dp[j+1][i+1] : max; } } printf("%d\n",max); int idx = 0; while(i && j){ if(dp[j][i] == dp[j-1][i]){ j--; } else if(dp[j][i] == dp[j][i-1]){ i--; } else{ res[idx] = str1[i-1]; i--; j--; idx++; } } while(res[--idx]) printf("%c",res[idx]); }
C++
복사