최 장 단조 로 운 증가 서브 시퀀스 (동적 계획)

최 장 단조 증가 서브 시퀀스
int 시퀀스 를 지정 하여 최 장 단조 로 운 증가 서브 시퀀스 를 구하 십시오.
1. 알고리즘 사상:
문제 변환: a 는 원시 서열 이 고 b 는 a 의 오름차 순 정렬 후의 서열 이 며 a 와 b 의 최 장 공공 서열 을 구한다.
2. 최 우선 서브 구조:
a 시퀀스 의 앞 i 개 요소 와 b 서열 의 전 j 개 요소 의 가장 긴 공공 서브 서열 은 반드시 a, b 의 가장 긴 공공 서브 서열 의 일부분 이다.
3. 상태 전이 방정식:
a 의 앞 i 개 요소 와 b 의 앞 j 개 요소 에 대해 t [i] [j] 는 공공 서브 시퀀스 의 최대 길이 이다.공공 하위 시퀀스 의 마지막 요 소 는 zx 입 니 다.
①a[i-1] = b[j-1] : t [i] [j] = t [i-1] [j-1] +1 
    마지막 요 소 는 같 습 니 다. zx 는 반드시 두 서열 의 마지막 요소 입 니 다.
②a[i-1] != b[j-1]: t [i] [j] = max(t[i-1][j], t[i][j-1])
    마지막 요소 가 다 르 면 zx 는 a 의 전 i - 1 개 요소 와 b 의 전 j 개 요소 가 가장 긴 공공 서브 서열 의 마지막 요소 이거 나 a 의 전 i 개 요소 와 b 의 전 j - 1 개 요소 가 가장 긴 공공 서브 서열 의 마지막 요소 이다. 원래 문제 가 가장 좋 은 해결 이 필요 하기 때문에 길이 가 비교적 크다.
원문 제의 해: t [n] [n]
4. 실현:
그 중에서 m [i] [j] 는 t [i] [j] 가 어떤 서브 문제 로 얻 었 는 지 기록 하 는 데 사용 된다.최종 결 과 를 출력 할 때 제목 은 출력 이 단 조 롭 게 증가 하 는 최 장 서브 시퀀스 를 요구 하 므 로 같은 값 을 제외 해 야 합 니 다.(코드 중의 limit 는 이 점 을 나타 낸다)
int solve(int a[],int n){
	int b[n],i,j;
	int t[n+1][n+1],m[n+1][n+1];
	for(i=0;it[i][j-1]?2:3;
			}
		}
	}
	i=n;j=n;
	int sub[n],k=0,limit=MaxInt;
	while(i>=0&&j>=0){
		if(m[i][j]==1&&a[i-1]=0;i--)
		cout<

5. 시간 복잡 도: O (n ^ 2)

좋은 웹페이지 즐겨찾기