주제 링크 : https://nanti.jisuanke.com/t/40255
중국 문제에 직면
문제 해결 방안을 첫째 오일러 정의 DP [0] [i]는 [J] (A)의 i 번째 요소 앞에 촬영 A, B 두 시퀀스 내림차순 결정 B의 J 소자 마지막 및 C 전 A B의 [의 j]가 소자 공감 DP [1] [I] [J] (A)의 i 번째 요소 앞에 촬영 마지막 j 번째 원소 B 이전 요소와 C는 A [i]는 다음이다 이 상태 전이 방정식을 얻을 쉽습니다. 따라서 최종 응답이 최대 인 (DP [0] [n]에 [N], DP [1] [N] [N]). 주목할만한 가치가 있습니다 제목은 롤링 배열의 사용을 필요로하거나, 메모리를 초과합니다.
링크 붙여 넣기 두 오일러 그것에 내림차순 : https://blog.csdn.net/qq_37632935/article/details/81264965
https://blog.csdn.net/u013534123/article/details/78912721
#INCLUDE <비트 / stdc ++ H.> 네임 스페이스를 사용하여 표준; 타입 정의 오래 오래 LL; CONST LL 모드 = 100003; CONST의 INT의 maxn = 5003; INT V1 [maxn] V2 [maxn]; LL A1 [maxn] B1 [maxn]; LL의 DP [2] [3] [maxn]; LL 모 (LL N, LL의 m) { 창 N <M N (N %의 m + m)? } LL 산도 (LL 않음) { LL ANS = N; LL 입술 = N; 대해 INT (I = 2; 나는 = 입술을 <*; 내가 ++) { 경우 (N % I == 0) { 의 ANS = 된 ANS은 / I *을 (I-1); 동안 (N % I == 0) { N / = 1; } } } 의 경우 (N> 1) = ANS ANS / N * (N-1); ANS를 반환; } LL의 qpow (LL N, LL의 m, LL 모) { // COUT << "YES \ 않음"; LL ANS = 1; 반면 (m) { 만약 (M 1) = ANS ANS * N 개의 모 %; m / = 2; N = N * n 개의 모 %; } 반환 ANS; } {(INT 인분, LL 모, LL의 TT)을 해결하는 것이다 (NUM == 1 || MO == 1)의 모 (TT, MO)을 반환하는 경우; ((NUM-1, 산도 (MO), TT) + 산도 (MO), MO를 해결 TT)를 반환 qpow; } INT의 main () { 게요, B; scanf와 ( "%의 LLD의 %의 LLD ', A, 및 B); INT 않음; scanf와 ( "%의 D", N); {위해 (나는 ++; i가 N <I = 0 INT) ( "%의 D", V1 [I])를 scanf와; } {위해 (; i가 N <I는 I = 0 ++ INT) 는 scanf ( "%의 D"를, V2 [I]); } {위해 (; i가 N <I가 ++ I = 0 INT) A1의 [I + 1] = qpow은 (a가 해결 (V1 [I], 모드 1, b) + 모드 1, 모드); } {위해 (; i가 N <I가 ++ I = 0 INT) (B1)의 [I + 1] = qpow은 (a가 해결 (V2 [I], 모드 1, b) + 모드 1, 모드); } (1 = 1을 int로; 대 (INT의 J = 1; j는 <=는 N; J ++) {// 0 (DP) [0] [i 번째 (1)] [J]는 DP가 = [1] [I & 1] [J] = 0; 경우 (B1, [J] == A1 [I]) { DP [0] [i 번째 1] [J] = 최대 (DP [0] [i 번째 1] [J], (DP) [1] [I & 1] (j-1 )] + B1 [J]); DP [1] [I & 1] [J] = 최대 (DP [1] [I & 1] [J], DP [0] [(I-1) 1] [J] + A1 [I]); } 다른 { DP [0] [i 번째 1] [J] = 최대 (DP [0] [i 번째 1] [J], (DP) [1] [1 & I] (j-1)]); DP [1] [1 & I] [J] = 최대 (DP [1] [1 & I] [J], DP [0] [(I-1) 1] [J]); } 경우 (B1, [J] == B1 [J-1]) { DP [0] [i 번째 1] [J] = 최대 (DP [0] [i 번째 1] [J], DP [0] [i 번째 (1)] [( J-1)] + B1 [J]); } 다른 { DP [0] [i 번째 1] [J] = 최대 (DP [0] [i 번째 1] [J], DP [0] [i 번째 (1) [(j-1)]); } // COUT << I << ''<< J << ''<< DP [0] [i 번째 1] [J] << ''<< (DP) [1] [1 & I] [J] << ENDL; } } COUT << 맥스 (DP [0] [n은 1 [N], DP [1] [n은 1 [N]) << ENDL; 0을 반환; }