#581(DIV 2)-E。ナターシャ、サーシャとプリフィックスSums-動的プログラミング+組合せ論ラウンドCodeforces

#581(DIV 2)-E。ナターシャ、サーシャとプリフィックスSums-動的プログラミング+組合せ論ラウンドCodeforces


【問題の内容】

あなたが\(N- \) A \(1 \)、\ (m個\)\( - 1 \) それらは任意に配置されている\(\ FRAC {(N + !M)} {N \のCDOTのM! !} \)の配列で、各配列は、最大の接頭辞があり、(おそらく\(0 \) )、すべてのプレフィックスの最大合計を求め、そしてどのくらいの。

【溶液】

定義\(DP [i]は[J ] \) 表現\が(私は\)\(1 \)、\ (J \)番目\ - (1 \)最大プレフィクスの全ておよび配置され、\ (DP [I] [J] \)状態遷移方程式である[1-I] [J] \(DP [I] [J] DP = + C_ {Iは、J-Jを+ 1} ^ {} + DP [I]、[J-1] -C_ I-J。1 + {}} ^ {I)をK [I]、[J]を\ +前記\(K [i]は[J ] \) 表現(私は\)\を\(1 \)、\ (J \) A ( - 1 \)\最大プレフィックスをされ(0 \)\配置番号。

前記\(DP [I-1]〜 [J] + C_ {I + J-1} ^ jが\) 新たに追加された数字を表し\(1 \) 最も遠位端をその中にすべてのすべての順列最大プレフィックスを配列し、増加している\(1 \)を、との合計\(C_ {I + J- 1} ^ J \) 順列ので、オリジナルに基づいて増加し\(C_ {I + J- 1} J ^ \)

\(DP [I]、[J -1] -C_ {I + J-1} ^ I + K [i]は[J] \) 新たに追加されたデジタル表す\( - 1 \)全て前出の、配置を最大プレフィックス還元\(1 \)最大プレフィックスに加えて、\(0 \)構成を。

なぜ\(I-1 \)\(1 \)、\ (J \) A \( - 1 \)全ての順列の数である\(C_ {I + J- 1} ^ J \) 、次いで?配置があるため、方程式の複数のセット(\ \ FRAC {((I -1)+ J)!} {(I-1)!\ CDOT J!} \) 得ました。

最大プレフィックスと\(K [i]は[J ] \) それを見つけますか?\(K [I] [J] = K [1-I] [J] K + [I]、[J-1] \)保証表し(I \ルjは\)\ここで、新しいデジタル追加場合に\(1 \)新たに追加されたプラスの端部に配置されている数の、( - 1 \)\、端部に配置されています順列の数。

最後の質問、なぜ\(DP \)配列\(1、-1 \)フロントエンドに配置する、\(K \)配列\(1、-1 \)の端部に配置される、そしてなぜ同時に缶前面および背面、ならびに任意の他の場所に?\(DP \)アレイは、エキストラとしての最大プレフィクス要件ので、フロントエンドと最大に配置されている\(1 \)後端に最大の可能な接頭辞と特定の最大、そのよう\(K \)上にアレイ接頭辞の後端との最大の要件ため\(0 \)そのような余分のような、\(1 \)フロントエンドに、最大値と最小値は、プレフィックスに等しい\(1 \)

それは限り、同じ計算が可能な順列の数の他の場所で繰り返されている場合、放電位置は、すべての可能な順列を含んでいるような他の位置に配置することができません。例えば、\(Iは\)\(1 \)、\ (J \)\( - 1 \) その配置の数として全て理解(C_が\ {IがJ ^ Jを+})\の場合、\(I-1 \)\(1 \)、\ (J \)\( - 1 \) 次いで配列の総数\(C_は{IがJ-Jを+1} ^ \) ならそこ\(I \) A \(1 \)、\ (J \) A \( - 1 \)配置の場合、総数である\(C_ {I + J- 1} ^ i = C_ {I + ^ {} 1-J-J。1} \)それらの間の関係は
[C_は^ {IがJ +} {C_ {J}を= IがJ-Jを+ 1} ^ {} + {Iは、J-C_を+1 1-J。} ^ {} \] \
によってパスカル式は、特定のタイプの確立を示しています。位置が関係によって決定され、配列の意味は、のみ置くことができる決定したかを知ることができる\(1 \)の位置を。


【コード】

/*
 * @Author: Simon 
 * @Date: 2019-08-28 19:32:35 
 * @Last Modified by: Simon
 * @Last Modified time: 2019-08-28 20:26:23
 */
#include<bits/stdc++.h>
using namespace std;
typedef int Int;
#define int long long
#define INF 0x3f3f3f3f
#define maxn 2005
const int mod=998244853;
int dp[maxn][maxn]/*i个1,j个-1的所有排列的最大前缀和之和为dp[i][j]*/,k[maxn][maxn]/*i个1,j个-1的所有排列的最大前缀和为0的个数*/;
int bit[maxn<<1],C[maxn<<1][maxn<<1]/*组合数组*/;
Int main(){
#ifndef ONLINE_JUDGE
    //freopen("input.in","r",stdin);
    //freopen("output.out","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;cin>>n>>m;
    bit[0]=1;C[0][0]=1;
    for(int i=1;i<=n+m;i++) bit[i]=bit[i-1]*i%mod,C[i][0]=1;
    for(int i=1;i<=m;i++) k[0][i]=1;
    for(int i=1;i<=n+m;i++){ //预处理
        for(int j=1;j<=n+m;j++){
            if(j>=i&&i<=n&&j<=m) k[i][j]=(k[i-1][j]+k[i][j-1])%mod;
            if(i>=j) C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
        }
    }
    for(int i=1;i<=n;i++) dp[i][0]=i;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            dp[i][j]=((dp[i-1][j]+C[i+j-1][j]+dp[i][j-1]-C[i+j-1][i]+k[i][j-1])%mod+mod)%mod;
        }
    }
    cout<<(dp[n][m]+mod)%mod<<endl;
#ifndef ONLINE_JUDGE
    cout<<endl;system("pause");
#endif
    return 0;
}

おすすめ

転載: www.cnblogs.com/--Simon/p/11429113.html
おすすめ