CF1204E(DP +数学)

ゲームは最大カウント数と配列された列挙値の最大値を列挙したかったされた場合には
、映画の数も間違っ
GGので、


私は今、料理...... ......一緒に考慮することができますか知って
考える(DP [I] [J \ ] \) 表現\(私は\)\(1 \)、\ (J \)\を(--1 \)答え
明らかにそれから\(DP [I-1]〜 [J] \) と\(DP [i]は[J -1] \) から転送を

\(DP [I-1]〜 [J] \) プラスで表される配列の先頭に\(1 \) また最大プレフィックス+1。この配列の合計\(C ^ {iがjで+ -1} _j \) 種、そう\(DP [I-1]〜 [J] \) の\(DP [i]は[J ] \) 寄与しましたある\(C ^ {iが+ Jの -1} _j \)

同様に、中\(DP [i]は[J -1] \) シーケンスの先頭で表さプラス\(--1 \) また、最大の接頭辞\(--1 \) ......最大の接頭語だけでなく、のように見えますそして、\(> 0 \)ときに何かが少ないです

算出された最大プレフィックスと考える\(= 0 \)プログラムの数、提供\(kは[I] [J ] \) 表現\(I \) A \(1 \)、\ (J \) A \( - 1 \) ゼロプレフィックス及びプログラムの最大数。もし(I> J \)\時間、\(K [I] [J] = 0 \) 場合\(I = 0 \)\(K [I] [J] = 1 \) 他の場合はしている\(K [I] [J] = K [I-1] [J] + K [I]、[J-1] \)、以来\(I-1 <J \)、添加の終了時のように\(1 \) 最大プレフィックスと変わりません。

コード:

#include <bits/stdc++.h>
#define N 2010
#define mod 998244853
#define For(i,x,y) for(int i=(x);i<=(y);++i)
#define Rof(i,x,y) for(int i=(x);i>=(y);--i)
using namespace std;

int C[N<<1][N<<1],dp[N][N],k[N][N];

inline int add(int x,int y){ return x+y>=mod?x+y-mod:x+y; }
inline int mns(int x,int y){ return x-y<0?x-y+mod:x-y; }
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    For(i,0,n+m){ 
        C[i][0]=1;
        For(j,1,i) C[i][j]=add(C[i-1][j],C[i-1][j-1]);
    }   
    For(i,1,m) k[0][i]=1;
    For(i,1,n) For(j,i,m) k[i][j]=add(k[i-1][j],k[i][j-1]);
    For(i,1,n) dp[i][0]=i;
    For(i,1,n)
        For(j,1,m)
            dp[i][j]=add(add(dp[i-1][j],C[i+j-1][j]),mns(dp[i][j-1],mns(C[i+j-1][i],k[i][j-1])));
    cout<<dp[n][m];
}

おすすめ

転載: www.cnblogs.com/PsychicBoom/p/11391572.html