题目:https://ac.nowcoder.com/acm/contest/885/G

题意:给你两个串,要求上面哪个串的子序列的值大于下面这个串的值的序列个数,不含前导零

思路:我们很容易就可以看出选择上面的那个的字符串的子序列时如果长度超过下面这个一定可以选用,同理长度短于的肯定不能用,长度大的部分我们可以用组合数来进行求解

所以难点就在于我们要求序列长度等于的时候有多少个序列满足要求,因为种数太多我们可以想到应该要用dp来优化复杂度,想一下,如果当前某一位低于了,那么这个串就肯定比他小了

所以我们要计算两种状态,到当前位置依然相等的个数 0  ,当前已经大于的序列个数 1

dp[i][j][k]

当前第一个串的第i位匹配第二个串的第j位第k种状态时有多少个序列

最后dp[n-1][m-1][1]就是长度相等时的答案

当然这里需要降维,把第一维去掉,我们就可以采用01背包那种做法,把第二种循环遍历顺序取反即可

最后我们还要判断以0开头的情况,这样是不合法的,但是我组合数时计算了值,所以我们最后还要去掉

#include<bits/stdc++.h>
#define maxn 3005
#define mod 998244353
using namespace std;
typedef long long ll;
ll dp[maxn][];
ll c[maxn][maxn];
int n,m;
char s1[maxn],s2[maxn];
ll fact[maxn],ifact[maxn];
ll p(ll a,ll b){
if(a+b>=mod){
return a+b-mod;
}
else return a+b;
}
int main(){
int t;
scanf("%d",&t);
c[][]=c[][]=;
for(int i=;i<maxn;i++){
c[i][]=;
for(int j=;j<=i;j++)
c[i][j]=p(c[i-][j],c[i-][j-]);
}
while(t--){
memset(dp,,sizeof(dp));
scanf("%d%d",&n,&m);
scanf("%s%s",s1,s2);
for(int i=;i<n;i++){//计算相等情况
if(i!=)
{
for(int j=min(i,m-);j>=;j--){
if(s1[i]==s2[j]){
dp[j][]=p(dp[j][],dp[j-][]);
dp[j][]=p(dp[j][],dp[j-][]);
}
else if(s1[i]>s2[j]){
dp[j][]=p(dp[j][],dp[j-][]);
dp[j][]=p(dp[j][],+dp[j-][]); }
else{
dp[j][]=p(dp[j][],dp[j-][]);
}
}
}
if(s1[i]==s2[]) dp[][]++;
else if(s1[i]>s2[]) dp[][]++;
}
ll sum=dp[m-][];
// printf("%lld\n",sum);
for(int i=m+;i<=n;i++){//计算大于长度的时候
sum=p(sum,c[n][i]);
}
for(int i=;i<n;i++){//去掉以0开头
if(s1[i]==''){
ll len=n-i-;
for(int j=m;j<=n&&j<=len;j++){
sum=p(sum-c[len][j],mod);
}
}
}
printf("%lld\n",p(sum,mod));
}
}

2019 牛客暑期多校 G subsequence 1 (dp+组合数)的更多相关文章

  1. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  2. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  3. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  4. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  5. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  6. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  7. 2019牛客暑期多校训练营(第八场)E.Explorer

    链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...

  8. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  9. 2019牛客暑期多校第五场题解ABGH

    A.digits 2 传送门 题意:给你一个n,要求输出一个每一位数字之和能整除n且其本身也能整除n的数.n不超过100,要求的数不超过10000位数. 题解:直接将n输出n次. 代码: #inclu ...

随机推荐

  1. luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元

    求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$   考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$   $\Rightarrow \sum_{i ...

  2. CTF | bugku | 字符?正则?

    做题链接 一个详细讲正则的网址1 一个详细讲正则的网址2 代码如下 <?php highlight_file('2.php'); $key='KEY{********************** ...

  3. 源码分析笔记Vector

    概述 继承抽象类AbStractList,实现接口List.RandomAccess.Cloneable以及序列化接口默认容量大小为10,扩容增量为0,扩容为原容量的2倍如设置的增量大于0,则扩容为( ...

  4. Mac os下设置国内镜像加速站

    无法忍受国外pip 仓库的龟速地址,安利一波国内高速镜像地址... 首推阿里云 repository 马爸爸  I ❤ u $ vim ~/.pip/pip.conf 在config中做如下配置: [ ...

  5. 关于C++中nothrow的某某某

    前言 在学习C++中new的种种用法时,在operator new的其中一个重载版本中看一个参数nothrow,想弄清楚到底是什么意思?nothrow顾名思义,就是不抛出的意思嘛!不抛出啥,在C++中 ...

  6. Python 进阶_函数式编程

    目录 目录 函数式编程 Python 函数式编程的特点 高阶函数 匿名函数 lambda 函数式编程相关的内置函数 filter 序列对象过滤器 map reduce 折叠 自定义的排序函数 最后 函 ...

  7. Git的安装配置

    Git是什么 Git是一款免费.开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 与常用的版本控制工具CVS.Subversion等不同的是它采用了分布式版本库的方式,不必 ...

  8. 面相对象编程 扩充之封装、访问机制、 property

    封装: 封装指的是可以将一堆属性和方法,封装到对象中 ps : 对象就好比一个 “袋子/容器”, 可以存放一堆属性和方法 ps : 存不是目的,目的是为了取,可以通过“对象” d的方式获取属性或方法 ...

  9. Java面试宝典(6)混合(前端 + 数据库)

    包括html & JavaScript & Ajax部分/Java web部分/数据库部分 三. html&JavaScript&ajax部分 1. 判断第二个日期比第 ...

  10. 设计模式--简单工厂(Simple Factory)

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...