複雑さは適切ではないどのように感じています。。
私は暴力の転送の複雑さは、右、良い食べ物ああです期待していませんでした。
#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 ; } / * * /