Codeforces 351Cジェフとブラケット行列の最適化DP

問題の意味:あなたは、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])。
}

  

おすすめ

転載: www.cnblogs.com/pkgunboat/p/10990308.html