トピックへのリンク: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を返します。 }