序列递推——cf1204E

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列递推——cf1204E相关的知识,希望对你有一定的参考价值。

/*
显然用dp[i][j]来表示i个1,j个-1的结果
dp[i][j]由dp[i-1][j]和dp[i][j-1]转移而来 
    即dp[i][j]对应的所有序列,都可以由dp[i-1][j]在前面加一个1或dp[i][j-1]在前面加一个-1得到,
         这里加在前面是因为更容易统计
          
        考虑1加在前面,那么对于任意一种(i-1,j)的排列,贡献都+1,C(i-1+j,j)
        考虑-1加在前面,那么对于某些(i,j-1)的排列,贡献-1
            考虑哪些不需要,前缀中-1的个数始终大于1的序列本来答案就是0,因此不需要-1

预处理这样的序列个数
    f[i][j]表示有i个1,j个-1时,前缀-1数量大于1的序列个数
    f[i][j]的来源有两种f[i][j-1],f[i-1][j]
    对于f[i][j]的每种序列,都可以由 f[i][j-1] 后加一个-1,或者 f[i-1][j]后面加一个1得到 
初始值:f[o][j]=1,f[i][j]=0,i>j
*/
#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];

 

以上是关于序列递推——cf1204E的主要内容,如果未能解决你的问题,请参考以下文章

CF1204E Natasha, Sasha and the Prefix Sums

动规,模拟,递推,最长公共子序列

ybtoj 递推二分C. 3.无限序列

CodeForces - 1204E Natasha, Sasha and the Prefix Sums (组合数学,卡特兰数扩展)

子序列(混合递推+前缀和 || 分块)

计算最长公共子序列复杂度的数学递推关系