서열이 2, 1, 3, 5, 가장 긴 승천 시퀀스가 2, 3, 5 또는 1, 3, 5이고 길이는 3이라고 가정합니다.
LIS 알고리즘의 아이디어는 다음과 같습니다.
시퀀스 a가 있다고 가정합니다.
em 요소가 하나만 있으면 가장 긴 승천 시퀀스의 길이는 1입니다.
② 두 가지 요소가있는 경우, [1]> a [0]이면 가장 긴 승천 시퀀스의 길이는 2이고, [1]은 가장 긴 승천 시퀀스의 마지막 요소입니다. A [1] <a [0]이면 가장 긴 승천 시퀀스의 길이는 1이고 [0]과 [1]은 가장 긴 승천 시퀀스의 마지막 요소입니다.
A a [2]> a [0], a [2]> a [1] 인 경우 세 가지 요소로 만들어지면 [2]는 [0] 또는 A [1]이있는 가장 긴 오름차순 하단의 마지막 요소가 될 수 있습니다. 그런 다음 선택할 시퀀스는 어느 시퀀스 a [0] 및 [1]이 더 길다는 것에 따라 다릅니다.
n 요소로 확장하려면 [n]을 마지막 요소로 가장 긴 승천 시퀀스의 길이를 보는 것입니다.
두 배열을 정의하십시오. 하나는 a이고 다른 하나는 b입니다.
A는 원래 데이터를 저장하고 B [i]는 [i]로 끝나는 가장 긴 승천 시퀀스의 길이를 저장합니다.
코드는 다음과 같습니다.
클래스 lmax {public static void lmax (int [] a, int [] b) {b [0] = 1; for (int i = 1; i <a.length; i ++) {int countmax = 0; for (int J = 0; // 요소 값이 A [i]보다 작은 후속 길이를 기록하지만 가장 긴 후속}} b [i] = countmax+1에 해당합니다. // [i] is}}}에 해당하는 가장 긴 후속 길이2. 형성에서 나가십시오
제목 설명 :
고등학교에있을 때 학교는 모든 교사와 학생들이 매일 아침 운동을하도록 조직했습니다. 운동 순서가 들릴 때마다 모든 사람들이 아래층으로 달려 가기 시작했고, 짧은 고가의 사람들은 줄 앞에 줄 지어 있었고, 더 큰 사람들은 줄의 끝에 늘어서있었습니다. 갑자기 어느 날, 팀을 담당하는 사람은 아이디어를 생각해 내고 그 형성을 바꾸고 싶었습니다. 즉, 모든 사람이 상부에서 내려 가면 모든 학생들이 무작위로 연속으로 점령되었고 팀을 담당하는 사람은 팀에서 학생들의 일원을 꺼내서 팀의 나머지 학생들의 높이는 "피크"모양이 처음으로 상승하여 앞에서 떨어졌습니다. 그러한 모양은 모든 사람에게 행운을 가져올 수 있다고 말합니다. 나는 여러분 모두가 학습 도로에서 정상을 오르기를 바랍니다. (주, 산의 한쪽만이 1, 1, 2, 2 및 1과 같은 조건을 충족시킵니다.
입력하다:
입력에는 여러 테스트 샘플이 포함될 수 있습니다.
각 테스트 사례에 대해 입력 한 첫 번째 줄은 정수 n (1 <= n <= 10000000)입니다. 입력 할 학생 수를 나타냅니다.
두 번째 입력 라인에는 N 정수가 포함됩니다. 학생의 높이 (CM)를 나타냅니다 (높이가 200보다 높지 않은 양의 정수).
산출:
각 테스트 사례에 대해, 그려야 할 최소 학생 수는 출력입니다.
샘플 입력 :
6
100 154 167 159 132 105
5
152 152 152 152 152 152
샘플 출력 :
0
4
LIS를 사용 하여이 문제를 해결할 때 다음을 고려할 수 있습니다.
먼저 LIS를 사용하여 각 요소로 끝나는 가장 긴 승천 시퀀스의 길이를 앞뒤로 찾은 다음 LIS를 사용하여 각 요소로 끝나는 가장 긴 승천 시퀀스의 길이를 찾으십시오.
2 개의 배열 B1, B2를 얻으십시오.
B1 및 B2는 해당 첨가에 해당하고 반복 된 첨가물을 빼는 것이 가장 긴 '산'입니다.
공개 클래스 피크 {public static void main (String [] args) {int n; int re; do {scanner in = new Scanner (System.In); n = in.nextint (); } while (n <0 || n> 100000); int [] a = new int [n]; // 원래 배열 int [] ar = new int [n]; // inverse array scanner in = new 스캐너 (System.In); for (int i = 0; i <n; i ++) {a [i] = in.nextint (); } int [] b1 = new int [n]; @suppresswarnings ( "미사용") int [] b2 = new int [n]; lmax.lmax (a, b1); ar = Reverse.Reverse (a); lmax.lmax (AR, B2); // 역 배열의 가장 긴 오름차순 서브 시퀀스를 해결합니다. b2 = reverse.Reverse (b2); // 원래 배열 re = result.result (b1, b2)의 가장 긴 오름차순 후속에 해당하는 대응하는 대응을 추가하기 위해 역 배열의 가장 긴 오름차순 하단을 역 역 배열의 역전. System.out.print (RE); }} <br> <br> <br> <br> 클래스 결과 {public static int result (int [] a, int [] b) {int max = 0; int [] c = new int [a.length]; for (int i = 0; i <a.length; i ++) {c [i] = a [i]+b [i]; } arrays.sort (c); max = c [c.length-1] -1; // 가장 긴 추가 및 반복 된 반환 a.length-max를 빼고 해당 사람; }}위의 것은 Java를 사용하여 LIS 알고리즘을 구현하고 형성을 만드는 문제의 모든 내용입니다. 모든 사람에게 도움이되기를 바랍니다. Wulin.com 더 지원 ~