CF1204Eの問題解決

**問題の元のプログラムは、修正されました。**元のプログラムは、ユニットにラインを越えている可能性は実際には問題ですが、CF上でそれをテストしていません。(CF比較評価魔法機械、またはそれは場合特殊な状況明らか境界を無視してもよいです)

そして、私は正確に同じことを実践していないようでしたか?私は書きます

まず、我々は、アレイは、1インデックスで宣言し、戻って行くことはありません。

接頭語のいくつかの種類と最大値を設定し、$ X $に$ num_x $の合計に等しいです。全ての合計は、あなたは、x \回$回数をnum_x $ \合計を使用することができます。しかし、各$ num_x $のようなコンピューティングDPを直接使用することはやや困難、アイデアの種類について。

列挙シーケンス、ヴァル$ $接頭最大と(ここで、最初のセットは、カウントを容易にするために、最後の時間に設定してもよい)$ P $の第1の最大の位置。このような配列の数を計算するためのすべての試み。これは確かに再びカウントされません。

\当量I <P $、すべての$ 1で、見つけることは容易では$ pre_i <pre_p $($ P $これ自体、 "旧" と呼ばれるに添付)を持っている、すべての$ P <I \当量のn + mに対して$は、持っている$ pre_i \当量pre_p(これは、 "背後" と呼ばれています)$。

一方、$ P $と$ヴァル$フロントのリリース番号をカウンタと$ 1 $と$ -1 $の後、$ 1 $の前の数は$(P + val)でそれは$ NUM1 $バーに設定されている/ 2 $、であることができます(もちろん、状況はオフに宣告$ NUM1 $の整数ではありません)。残数の数は、静止位置に記入することができますどこにそれ以外の場合は負の添字があるかもしれない、**オフ未満$ 1 $であり、また宣告。

有効なシーケンス番号の総数は、充填方法$ $前面と背面充填方法番号戻る$ $製品の前にあります。

$戻る$より良い "系列長の総数は$(N + MP)$、そこ$(M-NUM1)$ $ 1 $、であり、そして各プレフィックスが$ 0 $より大きくない"、$ N ^さ、数をカウントすることができます$ 2 DPは数えることができます。

$フロント$については、変形条件の前にそれを置きます。

$ Pre_i 0 $ <pre_pの$の転置は$ pre_p-pre_iだった>、この "$ pre_p-pre_i $は、" それは何であるのか?

![](https://cdn.luogu.com.cn/upload/image_hosting/v3l2l76j.png)

換言すれば、最後に$ pが$サフィックスに基づいています。接尾辞は以下$ 0 $でなければなりません。反転することができますノートには、接頭辞は、それが他のDPを算出することができ、接尾辞と同等とみなすことができます。

具体的には、私は何DP、$ F_ {iは、J} $ $ I $は、Jの配列$ $ $ $ 1の長さを示し、すべてのプレフィクス未満** $ 0 $のシーケンス番号よりもありません。配列のすなわち$ Jにそのようなすべてのテイク反対番号の数、$ $ $ IJ、プレフィックス、すべてが$ 0 $の数よりも大きくはないとなります。同様に、$ G_ {I、J} $プレフィックスは、すべての非空未満$ 0 $の数のプレフィックスを表します。

具体的には、転送コードを見ることは難しいことではありません。

$ K $が$ N + M $等しいです。

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
#defineがマップMIT <int型、int型> ::イテレータ
 の#define座るセット<整数> ::イテレータ
 の#define ITRM用(G、X)(MITグラム= x.begin();!G = x.end(); G ++)
 の#define ITRS(G、X)(座るグラム= x.begin(ため);!G = x.end(); G ++)
 の#define LTYPE int型
 の#define担当者(i、j、k)は、(LTYPE(用I)=(J)、(I)<=(K);(I)++)
 の#define用ラップ(I、J、K)(LTYPE(I)=(J)、(I)<(K) (I)++)
 の#define当たり(I、J、K)のための(LTYPE(I)=(J)、(I)> =(K);(I) - )
 の#define PII対<INT、整数>
 に#define Fiが最初
 に#defineSE第二
 の#define MPR make_pair
 の#define PB一back
 の#define fastio IOS :: sync_with_stdio(偽)
 のconst  int型 INF = 0x3f3f3f3f、MOD = 998244853 CONST  ダブル PI = 3.1415926535897932、EPS = 1E- 6 整数 N、M、F [ 4005 ] [ 4005 ]、G [ 4005 ] [ 2005 ]、ANS、K。
#defineチェック(I)IF(I> = MOD)I- = MOD。
INT メイン()
{ 
    scanf関数(" %D%D "、&​​N、&M)。//新しいバージョンnおよびmは、通常有する 
    Kが= N + M; 
    F [ 0 ] [ 0 ] = 1 ; 
    REP(I、1、K)REP(J、0、分(I、K))IF2 * J > = I){ // ここで分(I、N + M)である必要があり 、 コールがN上に二次元後ろFあろう
        IF(J> 0)F [I] [J] = F [I- 1 ] [J- 1 ]、
        F [I] [J] + = F [I- 1 ] [J]; 
        空(F [I] [J]); 
    } 
    G [ 0 ] [ 0 ] = 1 ; 
    REP(Iは、1、K)REP(J、0、分)(I、N-)IF2 * J> I){
         IF(J> 0)G [I] [J] = G [I- 1 ] [J- 1 ]、
        G [I] [J] = G + [I- 1 ] [J]; 
        空(G [I] [J]); 
    } 
    REP(P、1、K)REP(ヴァル、1 、分N-(P)){
         IF((Pヴァル+)&1。 続行;
         int型 NUM1 =(ヴァル+ P)/ 2 ;
         IF(NUM1> N-KP || <-n-NUM1)続行 ; //が、これは前に間違っている原因、KP <N-NUM1 、確かに合法ではありません。        
        ANS + =(LL)G [P] [NUM1] * F [KP] [KP-(N-NUM1)]%のMOD *ヴァル%MOD。
        (ANS)をご確認ください。
    } 
    のprintf(" %dの\ n " 、ANS)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/yz-beacon-cwk/p/12394667.html