問題の意味:あなたは、n * mの括弧列の長さが欲しい紙の上に、i番目の位置は、ビデオ括弧を左にとり、右括弧がビデオB [I%のn]は、Q費やされ、[I%のN]であります最小コストは未完成の順序を括弧します。N <= 20、M <= 1E7
アイデア:DPを提供よく行うためにかかわらず、問題のn及びmの制限は、[I] [j]は、位置iにある場合、jがバランス係数コストであり、DP [I] [J] =分(DP [I - 1] [J - 1] + [I]、DP [I - 1] [J + 1] + B [i])と、我々は余裕がない2E8へのn×m個のこのレベル。バランス率が2未満* nのであるので、以上の2 * nの場合、我々は、順序を交換することにより答えを変更することはできませんので、せいぜい2 * nのバランス係数の大きさ:しかし、私たちは自然を見つけることができます。1 - 我々は発見した転写DPは、1個のマトリックス乗算は(配置された遷移行列はCである)を1回転送が行われることができるについて、次いでC [J] [j + 1] [I]、C [J] [jは=思います] =のB [i]は、一旦により、このマトリックスは、転送を実行するために、aおよびbは長さNサイクルの配列であるので、我々は再び(連想マトリックス乗算から見て)、第n行列転送を扱うことができますこのようなシフトをn回実行すると、その後の高速行列電源回M、我々は、最終的な答えを得ます。
コード:
#include <ビット/ STDC ++ H> の#define INFの2E9 の#defineは、長い長いLL 名前空間stdを使用します。 [30] INT、B [30]、N。 構造体マトリックス{ LL [55] [55]。 マトリックス(INT X = INF){ memsetの(0x3fを、はsizeof(a)参照)。 以下のために(INT i = 0; iがNを<; iは++) [i]は[I] = xと; } 友人のマトリックス演算子*(CONSTマトリックス&A、CONSTマトリックス&B){ マトリックスANS。 以下のために(INT i = 0; iがNを<; I ++) のための(INT J = 0であり、j <N; J ++) のための(INT K = 0、K <Nであり、k ++) ANS [I] [J] =分(ANS [I]、[J]、A [i]が[K] + B [k]は[J])。 ANSを返します。 } 行列演算子^(int型のY){ 行列X = *この、ANS(0)。 {(Y >> = 1; Y)用 (Y&1)であればANS = ANS * X。 (J)TMP [J - 1]の場合[j]は[I] =。 X = X * X; } 戻りANS。 } のLL *演算子は、[](INT X){ [X]を返します。 } CONST LLの*演算子は、[](INT X)のconst { [X]を返します。 } }。 INTのmain(){ int型N、M。 scanf関数( "%d個の%のD"、&N、&M)。 (I 1 = int型、iが<= N; iが++)のため のscanf( "%dの"、および[I])。 (; iが<= N I ++はiは1 = INT)のため のscanf( "%dの"、&B [I])。 N = 2 * N + 1。 行列DP、A(0)。 DP [0] [0] = 0。 {(; iが<= N I ++はiは1 = INT)のための マトリックスTMP。 (INT J = 0であり、j <= N; J ++)用{ A = A * TMP。 IF(J <2 * N)TMP [J + 1] [j]は、Bが= [I]。 } DP = DP *(A ^ M)。 printf( "%LLDする\ n"、DP [0] [0])。 }