2011-04-22 3 views
11

M = 2 시퀀스에 대해 가장 길게 찾는 연구를 수행했지만 M> = 2 시퀀스에서이를 수행하는 방법을 파악하려고합니다. N 개의 고유 요소가있는 N 및 M : M 시퀀스가 ​​제공됩니다. N은 {1 - N}의 집합입니다. 동적 프로그래밍 접근 방식에 대해 생각해 봤지만 실제로 통합하는 방법에 대해서는 여전히 혼란 스럽습니다.여러 시퀀스에 대해 가장 긴 공통 서브 시퀀스

여기서 최대 시퀀스 알 수
5 3
5 3 4 1 2
2 5 4 3 1
5 2 3 1 4

입력 될
5 3 1

특급 산출 된 출력
길이 = 3

+0

지금까지 시도한 접근 방식을 게시 할 수 있습니까? 거기에서 우리는 올바른 방향으로 당신을 가리킬 수 있습니다 .. –

+0

M은 서브 시퀀스가 ​​있어야하는 시퀀스의 수입니까? – BiGYaN

+2

@Jerry 첫 번째 줄은 N과 M을 지정합니다. 이것은 C 콘테스트/숙제 문제 사양에 대해서는 보통입니다. –

답변

3

간단한 생각.

각 숫자가 i이고 범위가 1이고 N 인 경우 마지막 숫자가 i 인 가장 긴 하위 시퀀스를 계산하십시오. (a[i]이라고 부름)

이렇게하려면 처음부터 끝까지 첫 번째 시퀀스에서 숫자 i을 반복합니다. a[i] > 1 인 경우 숫자 j이 각 순서대로 i 앞에옵니다.
j의 가능한 모든 값을 확인하고 (이전 조건이 성립하는 경우) a[i] = max(a[i], a[j] + 1)을 확인하면됩니다.

마지막 비트는 j이 첫 번째 시퀀스에서 i 앞에 오기 때문에 a[j]이 이미 계산되었음을 의미합니다.

for each i in first_sequence 
    // for the OP's example, 'i' would take values [5, 3, 4, 1, 2], in this order 
    a[i] = 1; 
    for each j in 1..N 
     if j is before i in each sequence 
      a[i] = max(a[i], a[j] + 1) 
     end 
    end 
end 

사전에 위치 행렬을 계산하면 O(N^2*M)입니다.

+2

이것이 대부분 옳다고 생각하지만, 작성한 의사 코드는 혼란 스럽습니다. 그것은'i'가 시퀀스리스트를 반복하는 것처럼 보이지만'1'에서'N'으로 반복해서는 안됩니까? 나는 당신이'sequence [0]'을 첫 번째 시퀀스로 생각하고,'1 .. N'의 모든 원소를 포함하고 있다고 생각합니다.하지만'j'에 대해했던 것처럼 더 씁니다. – IVlad

+0

@IVlad 그래, 모든 숫자를 1에서 N으로 반복하면서도 올바른 순서로 반복해야합니다. 그러나 당신 말이 맞습니다. 의사 코드는 혼란 스러웠습니다. 나는 그것을 조금 분명히했다. '주문'요구 사항을 더 잘 제시 할 수 있는지 확실하지 않습니다. –

+0

대단히 고맙습니다. 여기에 무슨 일이 일어나고 있는지 이해하는 데 약간의 시간이 걸렸지 만 지금은 의미가 있습니다. – mkobit

1

"Design of a new Deterministic Algorithm for finding Common DNA Subsequence"용지를 볼 수 있습니다. 이 알고리즘을 사용하여 DAG를 구성 할 수 있습니다 (8 페이지, 그림 5). DAG에서 가장 큰 공통적 인 하위 시퀀스를 읽습니다. 그런 다음 M 값을 사용하여 시퀀스 당 생성해야하는 DAG 수를 결정하는 동적 프로그래밍 방식을 시도하십시오. 기본적으로 이러한 하위 시퀀스를 키로 사용하고 해당 시퀀스 번호가있는 위치에 저장 한 다음 최대 하위 시퀀스 (1보다 클 수 있음)를 찾으려고합니다.

2

는 독특한 요소를 가지고 있기 때문에, @Nikita 리박의 대답은 함께 갈 수있는 하나이지만, 동적 프로그래밍을 언급 한 이후, 여기에 두 개 이상의 시퀀스가있을 때 당신은 DP를 사용하십시오 방법은 다음과 같습니다

dp[i, j, k] = length of longest common subsequence considering the prefixes 
       a[1..i], b[1..j], c[1..k]. 


dp[i, j, k] = 1 + dp[i - 1, j - 1, k - 1] if a[i] = b[j] = c[k] 
      = max(dp[i - 1, j, k], dp[i, j - 1, k], dp[i, j, k - 1]) otherwise 

을 실제 하위 시퀀스를 다시 얻으려면 dp[a.Length, b.Length, c.Length]에서 시작하는 재귀 함수를 사용하고 기본적으로 위의 수식을 역순으로 바꾸십시오. 세 요소가 같으면 dp[a.Length - 1, b.Length - 1, c.Length - 1]으로 역 추적하여 문자를 인쇄하십시오. 그렇지 않은 경우 위의 값 중 최대 값에 따라 역 추적하십시오.

관련 문제