Codeforces 360C Levkoと文字列のDP(説明を参照)

Levkoとストリングス

複雑さは適切ではないどのように感じています。

私は暴力の転送の複雑さは、右、良い食べ物ああです期待していませんでした。

#include <ビット/ STDC ++。H>
 の#defineは LL長い長
 の#define LD長い二
 の#define ULL符号なし長い長
 の#define第Fiの
 に#define SE第二
 の#define MK make_pair
 の#define PLL対<LL、LL>
 の#define PLI対<LL、整数>
 の#define PII対<整数、整数>
 の#define SZ(X)((INT)x.size())
 の#define ALL(X)(X).begin()、(X).END( )
 の#define FIOイオス:: sync_with_stdio(偽); cin.tie(0)。使用して名前空間はstdを、const int型 N = 2000 + 7 

 

 const  int型 INF = 0x3f3f3f3f constの LL INF = 0x3f3f3f3f3f3f3f3f const  int型 MOD = 1E9 + 7 constの ダブル EPS = 1E- 8 ;
CONST  ダブル PI = ACOS( - 1 )。

テンプレート < クラス T、クラス S>インラインボイド追加(T&、S b)は{A + B =。もし(A> = MOD)A - = MOD;} 
テンプレート < クラス T、クラス S>インラインボイドサブ(T&、S b)は、{ - = B。もし(< 0)、A + = MOD;} 
テンプレート < クラス T、クラス S>インラインBOOL chkmax(T&、S B)は{ 返す <bは?= B、;} 
テンプレート < クラス T、クラス S>インラインブール chkmin(T&、S b)は{ 返す > bは?= B、;} 

int型N、M。
INT DP [N] [N]。
INT 和[N]。
チャーS [N]。

INT メイン(){ 
    scanf関数(" %D%D%S "、&​​N、&M、S + 1 )。
    DP [ 0 ] [ 0 ] = 1 
    和[ 0 ] = 1 int型 i = 1 ; iが<= N iが++ ){
         ためINT J = 0 ; J <= Mであり、j ++ ){ 
            DPは、[I] [J] = 1LLの*和[J] *(S [i]が- ' A ')%のMOD。
            int型 K = iが- 1、K> = 0&&(I - K)*(N - I + 1)<= J。k-- 
                を追加(DP [I]、[J]、1LL * DP [K] [J - (I - K)*(N - I + 1)] *(' Z ' - S [I])%MOD ); 
            追加(合計[J]、DP [I] [J]); 
        } 
    } 
    int型 ANS = 0 以下のためにint型 i = 0 ; iが<= N; iは++ )(ANS DPを[I] [M])を追加します。
    printf(" %d個の\ n " 、ANS)。
    リターン 0 ; 
} 

/ * 
* /

 

おすすめ

転載: www.cnblogs.com/CJLHY/p/11069650.html