序列递推——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];
}

原文地址:https://www.cnblogs.com/zsben991126/p/11517365.html

时间: 2024-10-10 13:27:20

序列递推——cf1204E的相关文章

[luogu2501 HAOI2006] 数字序列 (递推LIS)

题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. 输入输出格式 输入格式: 第一行包含一个数n,接下来n个整数按顺序描述每一项的键值. 输出格式: 第一行一个整数表示最少需要改变多少个数. 第二行一个整数,表示在改变的数最少的情况下,每个数改变的绝对值之和的最小值. 输入输出样例 输入样例#1: 4 5 2 3 5 输出样例#1: 1 4 说明 [数据范围] 90%的数据n<=6000.

玲珑杯 #10 A dp递推

A. Black and White 题意:n个格子排在一行,每个格子里都有一枚白棋或一枚黑棋.限制:不能有连续a枚黑棋或连续b枚白棋,问有多少种方案. tags:一开始还以为是组合数学,没想到又是dp.这mmp的还是签到题 考虑长度为 i 的合法序列与长度为 i−1 的合法序列有什么关系.定dp[i][black] 为有 i 枚棋子且最后一枚是黑色的合法方案数量,g[i]为有 i 枚棋子的合法方案数量.现假设前面 i-1 枚棋都是合法的,在 i 位置加一枚黑棋,唯一不合法的情况就是最后的a枚棋

【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. 在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论起了二叉搜索树.什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树.设key[p]表示结点p上的数值.对于其中的每个结点p,若其存在左孩子lch,则key

Recaman&#39;s Sequence_递推

Description The Recaman's sequence is defined by a0 = 0 ; for m > 0, am = am−1 − m if the rsulting am is positive and not already in the sequence, otherwise am = am−1 + m. The first few numbers in the Recaman's Sequence is 0, 1, 3, 6, 2, 7, 13, 20, 1

LA 4123 (计数 递推) Glenbow Museum

题意: 这种所有边都是垂直或水平的多边形,可以用一个字符串来表示,一个270°的内角记作O,一个90°的内角记作R. 如果多边形内存在一个点,能看到该多边形所有的点,则这个多边形对应的序列是合法的.这里长度不作限制,只要长度适当能满足要求即可. 现给出序列长度,问有多少种序列符合要求. 分析: 书上分析地很清楚,罗列一下要点: 首先对于一个长度为n的合法序列,R的个数为(n+4)/2,O的个数为(n-4)/2,即R比O多4个 我们要找的序列满足要求:R比O多4个,没有两个O相邻. 这里先设计了一

UVA - 10304Optimal Binary Search Tree(递推)

题目:UVA - 10304Optimal Binary Search Tree(递推) 题目大意:给出一组数,e1 < e2 < ... < en,现在要求将这些数组成一棵二叉搜索树,并且使得sum (ei * cost(ei))最小.cost(ei)表示ei到到根节点之间有多少条边. 解题思路:首先二叉搜索树要满足左节点小于根节点,右节点大于根节点.因此对于e1 < e2 < ... < en这样一组数,我们只要枚举根节点的位置ek,将这个序列分成左右子树两部分(e

uva 1485 - Permutation Counting(递推)

题目链接:uva 1485 - Permutation Counting 题目大意:给定n和k,要求求一个由1~n组成的序列,要求满足ai>i的i刚好有k个的序列种数. 解题思路:dp[j][i]表示长度为i,j个位置满足的情况. dp[j+1][i]+=dp[j][i]?(j+1); 1, (3), (4), 2: 括号位置代表ai>i,既满足位置,此时i = 4, j = 2. -> 1, (3), (4), 2, 5 1 种,在最后追加 -> 1, (5), (4), 2,

hdu 4869 Turn the pokers(递推&amp;组合数学&amp;逆元)

Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1279    Accepted Submission(s): 466 Problem Description During summer vacation,Alice stay at home for a long time, with nothing t

Luogu P1057 传球游戏(dp 递推)

P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目. 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里.两种传球方法被视