# 581 (사업부. 2) -E. 나타샤 사샤 및 접두어 Sums- 동적 프로그래밍 + 조합론 라운드 Codeforces

# 581 (사업부. 2) -E. 나타샤 사샤 및 접두어 Sums- 동적 프로그래밍 + 조합론 라운드 Codeforces


【문제 설명】

\ N- (\) \ (1 \) \ (m의 \) \ (- 1 \) , 그들은 어떤 배열된다 \ (\ FRAC {(N + ! m)} {N \의 cdot의 m! !} \) 배열에서 각 배열은 최대 접두사를 가지고 있으며 (아마도 \ (0 \) ), 모든 접두사의 최대 합을 찾고, 얼마나.

【해결책】

정의 \ (DP는 [I] [J ] \) 로 표현 \ (나는 \) \ (1 \) \ (J \) 번째 \ - (1- \) 최대 프리픽스 모두와 배치되며 \ (DP [I] [J] \) . 상태 천이 방정식은 : \ (DP [I] [J] DP = [. 1-I] [J] + C_는 {. I가 + J-J (1)} ^ {} + DP [I]. J- 1] -C_ I-J. (1) + {}} ^ {I)은 K [I] [J]를 \ + . 상기 \ (k는 [I] [J ] \) 표현 (I는 \) \를 \ (1 \) \ (J \) (- 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 \) \ (- 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 \) \ (1 \) \ (J \) \ (- 1 \) 배열의 다음의 총 수이다 \ (C_ {I + J = 1} ^ I = C_ {I + ^ {}. 1-J-J. 1} \) . 이들 사이의 관계는 :
\ [^ {I가 J를 +} C_ {. 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