2019 ICPC 중국 난창 (南昌) 전국 초청 및 국제 실크로드 프로그래밍 콘테스트 C. Xyjj의 순서 (내림차순으로 오일러 동적 프로그래밍 +)

주제 링크 : 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을 반환; 
}

  

 

추천

출처www.cnblogs.com/Zhi-71/p/11618661.html