题目: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. Javac编译找不到符号,报错

    Javac编译找不到符号 报错 找不到符号 如果是两个.java有调用关系,需要同时编译 首先我检查了下代码,发现并没有问题,然后将A.java文件的内容复制到D.java中,发现程序能正常运行,而之 ...

  2. 云平台(cloud platforms)

    云平台:允许开发者们或是将写好的程序放在“云”里运行,或是使用“云”里提供的服务,或二者皆是的服务 转向云计算(cloud computing),是业界将要面临的一个重大改变.各种云平台(cloud ...

  3. delphi 简单的发送字符串消息

    var pMes:^String; begin New(pMes); pMes^:=msg; PostMessage(Application.handle, WM_Custom, 0, Integer ...

  4. Centos7从零开始】Centos 下硬盘分区的最佳方案

    https://www.cnblogs.com/chen1970/p/11071590.html 在对硬盘进行分区前,应该先弄清楚计算机担负的工作及硬盘的容量有多大,还要考虑到以下几个问题: 第一点也 ...

  5. ASP.NET Core MVC/WebAPi 模型绑定探索 转载https://www.cnblogs.com/CreateMyself/p/6246977.html

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  6. Html5 学习笔记 【PC固定布局】 实战2 导航栏搜索区域

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  7. Prometheus 安装与配置

    下载Prometheus https://prometheus.io/download/ wget https://github.com/prometheus/prometheus/releases/ ...

  8. 记录Liunx 命令常用的

    df -h 查询硬盘容量(GB方式)

  9. XGBoost的推导和说明

    一.简介 XGBoost是“Extreme Gradient Boosting”的缩写,其中“Gradient Boosting”一词在论文Greedy Function Approximation: ...

  10. tomcat开启PID文件

    1.配置tomcat启动后将进程号保存至 ./bin/tomcat.pid 文件. 修改 catalina.sh 文件,在 PRGDIR 下面一行添加 CATALINAPID 参数行,如下: PRGD ...