2019 ICPC中国南昌ナショナルインビテーショナル国際シルクロードのプログラミングコンテストC. Xyjjの順(降順でオイラーの動的プログラミング+)

トピックへのリンク:https://nanti.jisuanke.com/t/40255

中国は疑問に直面します。

 

問題解決のアイデア:最初のオイラー[0] [I] [j]が最後の前にA、B jの要素のi番目の要素の前に行われるDPを定義して、A、B二つの配列を降順で決定され、CとB [j]を要素である、共感のDPは、[1]〜[I] [j]は、j番目のエレメントBの前に最後の要素のi番目の要素の前に採取され、そしてCは、その後、[I]であります状態遷移方程式を取得することは容易です。最終的な答えは、MAX(DP [0] [N] [N]、DP [1]〜[N] [N])です。注目に値するがあります。タイトルはローリングアレイの使用を必要とする、またはメモリを超えてしまいます。

リンク貼り付け2オイラーそれに降順:https://blog.csdn.net/qq_37632935/article/details/81264965

https://blog.csdn.net/u013534123/article/details/78912721

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
typedefの長い長いLL。
constのLL MOD = 100003; 
const int型MAXN = 5003; 
int型V1 [MAXN]、V2 [MAXN]。
LL A1 [MAXN]、[MAXN] B1。
LL DP [2] [3] [MAXN]。
LL MOD(LL N、LLのM){ 
	戻りN <M N:(N%のM + M)。
} 
LL性pH(LL n)で{ 
	LL ANS = N。
	LL RES = N。
	(I 2 = int型私は++; iは= RESを<*)のために、{ 
		(N%iは== 0){場合
			ANS = ANS / Iは、(i-1)*。
			一方、(N%I == 0){ 
				N / A = I。
			} 
		} 
	} 
	もし、(N> 1)ANS = ANS / N *(N-1)。
	ANSを返します。
} 
LL qpow(LL N、LLのM、LLのMO){ 
// COUT << "YESの\ n"。
	LL ANS = 1。
	一方、(M){
		(M 1)ANS = ANS * N%のMO場合、B)+ V-1、V)。
	}
		M / = 2。
		N = N * N%のMO; 
	} 
	戻りANS。
} 
{(int型NUM、LLのMO、LLのTT)を解くちゃう
	(NUM == 1 || MO == 1)がMOD(TT、MO)を返した場合、
	((NUM-1のpH(MO)、TT)+のpH(MO)、MOを解決するため、TT)をqpow返します。
} 
int型のmain(){ 
	LL、B。
	scanf関数( "%のLLDの%のLLD"、&、&B)。
	int型のn; 
	scanf関数( "%のD"、&N); 
	{ため(iは++; 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は(解決(V1 [i]が、MOD-1、B)+ MOD-1、MOD)。
	} 
	{ため(; iがn <I ++はi = 0 INT)
		のB1 [I + 1] = qpowは(解決(V2 [i]は、MOD-1、B)+ MOD-1、MOD)。
	I = 1をint型(ため。
		(INT J = 1; J <= nであり、j ++){//用0 
			DP [0] [I&1]〜[J] = DPは、[1]〜[I&1] [j]は= 0。
			IF(B1 [J] == A1 [I]){ 
				DP [0] [I&1]〜[J] = MAX(DP [0] [I&1]〜[J]、DP [1]〜[I&1] [(J-1 )] + B1 [J])。
				DP [1]〜[I&1]〜[J] = MAX(DP [1]〜[I&1]〜[J]、DP [0] [(I-1)&1] [J] + A1 [I])。
			} 
			他{ 
				DP [0] [I&1]〜[J] = MAX(DP [0] [I&1]〜[J]、DP [1]〜[I&1] [(J-1)])。
				DP [1]〜[I&1]〜[J] = MAX(DP [1]〜[I&1]〜[J]、DP [0] [(I-1)&1] [J])。
			} 
			IF(B1 [J] == B1 [J-1]){ 
				DP [0] [I&1]〜[J] = MAX(DP [0] [I&1]〜[J]、DP [0] [I&1] [( J-1)] + B1 [J])。
			} 
			他{ 
				DP [0] [I&1]〜[J] = MAX(DP [0] [I&1]〜[J]、DP [0] [I&1] [(J-1)])。
			} 
			} 
	// COUT << I << " "<< J <<" "<< DP [0] [I&1]〜[J] <<"" << DP [1]〜[I&1]〜[J] << ENDL ; 
		} 
	} 
	COUT << MAX(DP [0] [N - 1] [n]は、DP [1]〜[N - 1] [N])<< ENDL。
	0を返します。
}

  

 

おすすめ

転載: www.cnblogs.com/Zhi-71/p/11618661.html