ナッシュ均衡とHDU 6415リッカイン(DPカウント)

質問の意味:2つの整数を与えるN、M、あなたはすべての番号1〜n個の* mを使用してみましょう、とn×m個の行列の行列を構築し、この行列が満たす:それだけで一つの要素は、この行とこの列にあるありますさまざまな方法を求めて、最大。

分析:これは、最大数であるため、質問の意味によると、あなたは他の可能性は存在しません、その要素は、n×m個でなければなりません知ることができ、我々は順序がサイズ、最大の最初の場所を入れて、二番目に大きい置くことを検討し、そうではないあなたがいない場合、それはまた、その行と最大の列である必要があるため、すべての行または列の最大数の全てでなければなりません、それがあるべき次の最大の位置を考えると、やります条件が満たさ同じ第三に置かれるだけでなく、同様に他の同じようにすべての行または列の最大または第二の最大を配置します。したがって、状態方程式、DPがある[I] [J] [K]を表し、Iは聞かせている行番号、jの列の数は、LET行き、最後の番号が正放電の反対ので、K置かれてきました結果は同じである置くので、我々は次のように放電、転写式に従ってポジティブ、即ち1〜N×m個を置くことができます。

1. J [i]はDPであろう(この位置は、行と列の交差点ではない)、新しい行が既に存在するに、すべての列を選択し、その後、カラム内の位置を選択された追加最初の検討] [k]は= DP [I-1]〜[J] [K-1] * J×(N-i + 1)の

2. [[i]は列に、すなわちDP(この位置は、行と列の交差することはできません)の位置を選択し、次に発生されたすべては、その後、新規に追加するすべての行の行を選択することを検討し、及びJ-1] [K-1] * iが(M-J + 1)*

3.検討して行と列の交点上に配置され、DP [I] [J] [k]は(iはJ-K + 1 *)* DP [I] [J] [K-1] =。

もちろん、最適化することはできません、スクロール配列の最適化を使用することができます考えてみましょう。

コードは以下の通りであります:

#include <ビット/ STDC ++ H> 
名前空間STDを使用して、
typedefの長い長いLL。
CONST int型MAXN = 80 + 7。
N INT、M。
INT DP [2] [MAXN] [MAXN]。

INTのmain(){ 
  int型のT。scanf関数( "%のD"、&T)。
  { - (T)一方
    、INT K 
    scanf関数( "%D%D%D"、&N、&M、&K)。
    memsetの(DP [0]、0、はsizeof DP [0])。
    DP [0] [1] [1] = N * M%のK。
    int型CUR = 1; 
    (int型のK = 2、M * N = <K; ++、K、CUR ^ = 1)のための{ 
      memsetの(DP [CUR]、0、はsizeof DP [CUR])。
      以下のための(iは1 = int型、iが<= N; I ++)
        のために(INT J = 1; J <= M; ++ j)は{ 
          (iはJ <K *)続行。
          DP [CUR] [I] [J] =((LL)DP [CUR ^ 1] [I] [J] *(i *がJ-K + 1)%のK +(LL)DP [CUR ^ 1] [ I-1]〜[J] * J×(N-I + 1)%のK +(LL)DP [CUR ^ 1] [I]、[J-1] * i *が(M-J + 1)%K) %K。
        } 
    } 
    のprintf( "%I64dの\ n"、DP [CUR ^ 1] [n]は[M])。
  } 
  0を返します。
}

  

 

おすすめ

転載: www.cnblogs.com/dwtfukgv/p/11502331.html