タイトル
C(N、3)行列の次数、各ステージは、文字、MAPを表す[I] [j]はiが打つことができる、jの確率を与える、あなたは相手を倒すためにM個の順序を与える必要があります。あなたが開始する役割を選択することができ、あなたは相手の役割を交換するかどうかを選択することができ、最後のよりも最大の勝率は相手に敗北した後に尋ねます。
考え
定義されたDP [I] [J]配列、私はjはゲーム私の後に文字選択を表し、相手をヒットするいくつかの最初を表します。[ - 1 I] [J] *エッジ[J] [A](i番目の相手使って明確に[I] [J] = DP文字の交換の言葉でない場合は、各文字の転送はDPで知ることができます役割)。すべての後、役割の完全な転換を求めずに、その後、相手の最適な状況の現在の役割に変換するには、すべてのケースで最高の変わらないを選択することです。
書式#include <iostreamの> の#include <CStringの> の#include < 文字列 > の#include <アルゴリズム> 書式#include <cmath> の#include <cstdioを> する#include <キュー> の#include <スタック> の#include <マップ> に#define ULL unsigned long型長い の#defineは(B)のmemset(A、B、はsizeof(A))を満たす の#define - lowbit(X)(x)は、x&() の#define MID(L + R)/ 2 の#defineが長い長いllの使用名前空間をSTD; const int型 MAXN = 1E4 + 7 。 CONST LL MOD = 1E6 + 3 。 const int型 INF = 0x3f3f3f3f 。 constの LL INF = 0x3f3f3f3f3f3f3f3f 。 ダブルエッジ[ 210 ] [ 210 ]。 二重 DP [MAXN] [ 210 ]。 INT のmain(){ int型のn; 一方、(CIN >> {N) N = N *(N- 1)*(N- 2)/ 6 。 以下のために(int型 i = 1 ; iが= N <; iは++ ){ ため(int型 J = 1 ; J <= N。J ++ ){ CIN >> エッジ[I] [J]。 } }
//初始化边界 ため(INT I = 0 ; I <= N; iは++ ){ DP [ 0 ] [I] = 1 。 } int型M。 cinを >> メートル。 ダブルMX; 以下のために(int型 iは= 1 ; iが<= M iは++ ){ int型。 CIN >> ;++ ; MX = - 1 。 用(INT J = 1 ; J <= nであり、j ++ ){ DP [I] [J] = DP [I- 1 ] [j] * エッジ[j]は[A]。 MX = MAX(MX、DP [I] [J])。 } DP [i]は[A] = MX。 } のprintf(" %.6lfする\ n " 、MX)。 } 戻り 0 。 }