차례
문제 정책
“Number Of Longest Increasing Subsequence”문제는 n 크기의 배열 a []가 주어 졌음을 나타냅니다. 가장 오래 증가하는 하위 시퀀스 수를 인쇄합니다.
예
a[ ] = {1, 2, 5, 4, 7}
2
설명 : 가장 오래 증가하는 하위 시퀀스는 위 이미지에서 볼 수 있습니다.
입력 : a [] = {1, 2, 3, 4, 5}
출력 : 1 (1,2,3,4,5는 여기서 가장 긴 하위 시퀀스입니다)
가장 오래 증가하는 하위 시퀀스 수 알고리즘
- 초기화 정렬 a [] / 정수 크기 n의 유형.
- 수를 찾는 함수를 만듭니다. 가장 오래 증가하는 하위 시퀀스 정수 유형의 배열과 매개 변수의 크기를 허용합니다.
- 정수형 len 및 cnt 크기 n의 배열 두 개를 만들고 두 배열의 모든 요소를 1로 초기화합니다. 또한 정수 변수 lis = 1을 초기화합니다.
- i를 사용하여 1에서 n-1까지 이동하고 0에서 i-1까지 내부 루프를 만듭니다.
- 외부 루프의 현재 인덱스에있는 배열 a []의 요소가 내부 루프의 현재 인덱스에있는 배열 a []의 요소보다 큰지 확인하고, 내부 루프의 현재 인덱스에있는 배열 len []의 값 + 1이 있는지 확인합니다. 루프가 외부 루프의 현재 인덱스에서 배열 len []의 요소보다 큰 경우, 외부 루프의 현재 인덱스에서 배열 len []의 값을 내부 루프의 현재 인덱스에서 배열 len []의 값 + 1로 업데이트하고 내부 루프의 현재 인덱스에있는 배열 cnt []의 값으로 외부 루프의 현재 인덱스에있는 배열 cnt []의 값.
- 그렇지 않으면 내부 루프의 현재 인덱스에있는 len []의 값이 외부 루프의 현재 인덱스에있는 배열 len []의 요소와 같으면 배열의 값 + 1이 외부 루프의 현재 인덱스에있는 배열 cnt []의 값을 다음과 같이 업데이트합니다. 내부 루프의 현재 인덱스와 외부 루프 자체의 배열 cnt []에있는 값의 합.
- lis와 len [i]의 최대 값을 lis에 저장합니다.
- 변수 ans를 0으로 초기화합니다.
- 0에서 n-1로 다시 이동하고 len [i]가 lis와 같은지 확인하고 ans에있는 cnt의 현재 인덱스에 값을 추가합니다.
- 반환 ans.
암호
가장 오래 증가하는 하위 시퀀스 수를 찾는 C ++ 프로그램
#include <bits/stdc++.h> using namespace std; class Longestsubseq{ public: int numOfIncSubseq(int a[], int n){ int len[n], cnt[n]; for(int i=0; i<n; i++){ len[i]=1; cnt[i]=1; } int lis = 1; for(int i=1; i<n; i++){ for(int j=0; j<i; j++){ if(a[i] > a[j]){ if(len[j]+1 > len[i]){ len[i] = len[j]+1; cnt[i] = cnt[j]; } else if(len[j]+1 == len[i]){ cnt[i] += cnt[j]; } } lis = max(lis, len[i]); } } int ans = 0; for(int i=0; i<n; i++){ if(len[i] == lis)ans += cnt[i]; } return ans; } }; int main(){ Longestsubseq ls; int a[] = {1,2,5,4,7}; int n = sizeof(a)/sizeof(a[0]); cout<<(ls.numOfIncSubseq(a, n)); return 0; }
2
가장 오래 증가하는 하위 시퀀스 수를 찾는 Java 프로그램
import java.util.*; class Longestsubseq{ static int numOfIncSubseq(int[] a, int n){ int[] len = new int[n]; int[] cnt = new int[n]; for(int i=0; i<n; i++){ len[i]=1; cnt[i]=1; } int lis = 1; for(int i=1; i<n; i++){ for(int j=0; j<i; j++){ if(a[i] > a[j]){ if(len[j]+1 > len[i]){ len[i] = len[j]+1; cnt[i] = cnt[j]; } else if(len[j]+1 == len[i]){ cnt[i] += cnt[j]; } } lis = Math.max(lis, len[i]); } } int ans = 0; for(int i=0; i<n; i++){ if(len[i] == lis)ans += cnt[i]; } return ans; } public static void main (String[] args){ int[] a = {1,2,5,4,7}; int n = a.length; System.out.println(numOfIncSubseq(a, n)); } }
2
복잡성 분석
시간 복잡성
O (n * n) 여기서 n은 주어진 배열 a []에있는 요소의 수입니다. 시간 복잡도는 가장 오래 증가하는 하위 시퀀스를 찾는 데 필요한 것과 동일합니다.
공간 복잡성
O (N) 여분의 n 공간을 사용했기 때문입니다. 우리는 i 번째 요소에서 끝나는 가장 긴 증가하는 하위 시퀀스를 저장하는 len [] 배열을 사용했습니다.