질문의 의미 : https://www.luogu.com.cn/problem/P1108
두 숫자가 구성 컬럼의 동일한 수 있다면, 우리는 그 두 개의 동일한 열을 말한다.
가장 긴 시퀀스 감소의 수를 찾는 프로그램.
에서 문제 해결 wjyyy 위대하신 하나님.
에서는 DP 공정 F 저장 어레이가 가장 긴 시퀀스 거부의 길이이며, F 첨자 F 배열 난 은 IS I (마지막 바깥 제외) 단부 수단 긴 시퀀스 드롭 데이터가 삭제되어, 함께 프로그램 번호 여부를 결정할 때, 따라서 더 이상 적용되지 않습니다.
우리는 처음부터 보면,
- 동일한 번호의 첫 번째 행의 열 다른 번호의 첫 번째 숫자의 개수, 지금 그들은, 즉 동일한 측정 할 수 있다면, 하나는 삭제한다 (처리 코드는 T [J] = 0 ). 그 뒷면에 다른 번호에 연결하고, 그들이 판단 할 수있는 경우가 서로 영향을주지 않습니다 두 시리즈. 두 열은 열 동수부터 전송 될 수 있기 때문에
- 동일하지 않도록 첫 번째 숫자의 행의 다른의 컬럼의 다른 번호와 동일하지, 다시 추가 상관없이, 즉 삭제되지와 첫 번째 숫자의 수는 다음 기존의 판단에 따라 계속합니다.
위의 두 점에서, 우리는 반복이 방지 이중 계산을 삭제했다.
#INCLUDE <비트 / STDC ++ H.> 은 USING 스페이스 STD 단계; #DEFINE의 최대 (A, B) (A> B A :? B) INT A [ 5009 ], F [ 5009 ], [T (5009) ]; // A [ I] 주가, F [i]를 대상 최장 하루 전 길이이다 // T [i]는 i가 프로그램을 종료한다 int 치 주 () { INT N-, MAXN = 0 ; CIN을 >> N-; 대 ( INT I = 1. ; I <= N-; I ++) CIN >> A [I], F [I] = 1이다. ] 대 ( INT I = 1. ; I <= N-; I ++ ) { 대( int 치 = J 1. , J는 <I, J ++ ) { IF (A는 [I]는 < A [J]) F는 [I]는 = 최대 (F [I], F는 [J]는 + 1이다. ) } //이 이제 긴 정상적인 감소 시퀀스 시크 MAXN가 = 최대 (MAXN, F [I]) // 최장 길이 참고 용 ( INT J = 1. , J <I, J ++ ) { IF (F [I] == F를 [J] && A [I] == A [J]) // 동일한 길이와 동일의 열의 개수 T [J] = 0 ; 다른 IF (F [I] == F [J] + . 1 && A [I] <A [J]) // 의 전면에 접속 될 수있다 t [I] + = t [J] } 경우 (t [I]!) t [I] = 1 ; // 为了后面的数转移 } INT ANS = 0 ; 위한 ( INT 난 = 1 ; I <= N; I ++ ) 의 경우 (F [I] == maxn) ANS + = t [I]; COUT << maxn << " " << ANS; }