比赛的时候脑瘫了没想出来。。打多校以来最自闭的一场

显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数

官方题解是反着往前推,想了下反着推的确简单,因为高位的数优先级高,如果高位满足条件,那么低位只要用组合数求一下就行

#include<bits/stdc++.h>
using namespace std;
#define maxn 3005
#define ll long long
#define mod 998244353
int n,m;
char s[maxn],t[maxn];
ll dp[maxn][maxn];//dp[i][j]表示后面i个字符中取j个,比t大的方案数
ll C[maxn][maxn];
void init(){
C[][]=;
for(int i=;i<=;i++){
C[i][]=;
for(int j=;j<=i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%mod;
}
} void reserve(char s[]){
int len=strlen(s);
int i=,j=len-;
while(i<j){
swap(s[i],s[j]);
++i,--j;
}
}
int main(){
int T;cin>>T;
init();
while(T--){
cin>>n>>m;
scanf("%s",s+);
scanf("%s",t+);
if(m>n){puts("");continue;} for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
dp[i][j]=; reserve(s+);
reserve(t+);
for(int i=;i<=n;i++){
//dp[i][0]=1;
for(int j=;j<=m&&j<=i;j++){
dp[i][j]=dp[i-][j];//不选第i位
if(s[i]>t[j])
dp[i][j]=(dp[i][j]+C[i-][j-])%mod;
if(s[i]==t[j])
dp[i][j]=(dp[i][j]+dp[i-][j-])%mod;
}
} ll ans=dp[n][m]; reserve(s+);
for(int i=;i<=n;i++)if(s[i]!=''){
for(int j=m;j<=n-i;j++)
ans=(ans+C[n-i][j])%mod;
}
cout<<ans<<'\n';
}
}

然后是正着往后推,其实难度也不大,只不过状态表示为dp[i][j]为s中前i个取j个,和t取前j个相等的情况,然后转移过程中更新ans即可

#include <bits/stdc++.h>
using namespace std; typedef long long LL; const int MAXN=,MOD=; int C[MAXN][MAXN],dp[MAXN][MAXN];
char a[MAXN],b[MAXN]; void solve()
{
int n,m;
scanf("%d%d%s%s",&n,&m,a+,b+);
int ans=;
for (int i=;i<=n;i++)
if (a[i]!='')
for (int j=m;j<=n-i;j++)
(ans+=C[n-i][j])%=MOD;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
dp[i][j]=;
dp[][]=;
for (int i=;i<=n;i++)
{
dp[i][]=;
for (int j=;j<=m;j++)
{
dp[i][j]=dp[i-][j];
if (a[i]==b[j])
(dp[i][j]+=dp[i-][j-])%=MOD;
else if (a[i]>b[j])
ans=(ans+(LL)dp[i-][j-]*C[n-i][m-j])%MOD;
}
}
printf("%d\n",ans);
} int main()
{
#ifdef local
freopen("read.txt","r",stdin);
#endif
for (int i=;i<=;i++)
{
C[i][]=;
for (int j=;j<=i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%MOD;
}
int T;
scanf("%d",&T);
while (T--) solve();
return ;
}

字符串dp——牛客多校第五场G的更多相关文章

  1. 2019牛客多校第五场 G subsequence 1 dp+组合数学

    subsequence 1 题意 给出两个数字串s,t,求s的子序列中在数值上大于t串的数量 分析 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩 ...

  2. 牛客多校第五场G

    subsequence 1 只要处理长度等于t的. 转移方程没想出来QAQ $dp(i,j,0)$代表到$s[i]$为止有多少个前缀序列与$t[0\cdots j]$相同 所以有$dp(i,j,0)= ...

  3. 牛客多校第五场 G subsequence 1 最长公共子序列/组合数

    题意: 给定两个由数字组成的序列s,t,找出s所有数值大于t的子序列.注意不是字典序大. 题解: 首先特判s比t短或一样长的情况. 当s比t长时,直接用组合数计算s不以0开头的,长度大于t的所有子序列 ...

  4. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  5. 牛客多校第五场 F take

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...

  6. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  7. 牛客多校第五场-D-inv

    链接:https://www.nowcoder.com/acm/contest/143/D来源:牛客网 题目描述 Kanade has an even number n and a permutati ...

  8. 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...

  9. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

随机推荐

  1. vue项目从0开始记录

    1.安装vue-cli 2.通过脚手架进行项目的创建    4.配置第三方UI库快速开发(如ivew,element ui) 5.配置axios 库 一.安装vue-cli npm install - ...

  2. spring boot 项目的创建

    一. 进入https://start.spring.io 快速创建项目 二. 利用eclipse sts插件创建项目 1. 安装sts插件 进入https://spring.io/tools3/sts ...

  3. Centos 更改语言设置为中文

    说明 自己装系统时一般都可以自定义选择系统语言.可是云端服务器一般都是安装好的镜像,默认系统语言为英文,对于初学者可能还会有搞不懂的计算机词汇.这里简单说一下centos7怎么修改系统语言为中文. 修 ...

  4. Java多线程常用方法的使用

    Java多线程的常用方法基本分为:获取当前线程的操作,线程休眠sleep()方法,线程让步yield()方法,等待其他线程终止join()方法,线程停止的一系列方法. 一.获取当前线程的操作   1. ...

  5. Dart编程实例 - 类型测试操作符is

    Dart编程实例 - 类型测试操作符is void main() { int n = 2; print(n is int); } 本文转自:http://codingdict.com/article/ ...

  6. Html加水印和禁用复制和右键(jquery.watermark.js)

    近期遇到一个需求,需要在页面背景加上自己的水印和禁止用户在页面复制粘贴 解决: 水印使用的是jquery.watermark.js插件,这个插件可以在html背景上加水印,同时可以设置相关属性值. 相 ...

  7. RQNOJ PID4 数列

    题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是 ...

  8. PHP-FPM 远程代码执行漏洞(CVE-2019-11043)复现-含EXP

    搭建容器 安装golang 利用程序 https://github.com/neex/phuip-fpizdam 安装git Cobra包安装 go get -v github.com/spf13/c ...

  9. 获取hdfs集群信息(fs.defaultFS)

    [root@hive-dp-7bd6fd4d55-wctjn hive-1.1.0-cdh5.14.0]# hdfs getconf -confKey fs.default.name19/12/04 ...

  10. 设计模式四人帮(GOF)是什么?

    1994年,有四位作者:Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides发表了一本题为<设计模式 - 可重用的面向对象软件元素>的 ...