字符串dp——牛客多校第五场G
比赛的时候脑瘫了没想出来。。打多校以来最自闭的一场
显然从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的更多相关文章
- 2019牛客多校第五场 G subsequence 1 dp+组合数学
subsequence 1 题意 给出两个数字串s,t,求s的子序列中在数值上大于t串的数量 分析 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩 ...
- 牛客多校第五场G
subsequence 1 只要处理长度等于t的. 转移方程没想出来QAQ $dp(i,j,0)$代表到$s[i]$为止有多少个前缀序列与$t[0\cdots j]$相同 所以有$dp(i,j,0)= ...
- 牛客多校第五场 G subsequence 1 最长公共子序列/组合数
题意: 给定两个由数字组成的序列s,t,找出s所有数值大于t的子序列.注意不是字典序大. 题解: 首先特判s比t短或一样长的情况. 当s比t长时,直接用组合数计算s不以0开头的,长度大于t的所有子序列 ...
- 牛客多校第三场 G Removing Stones(分治+线段树)
牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...
- 牛客多校第五场 F take
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...
- 牛客多校第五场 J:Plan
链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客多校第五场-D-inv
链接:https://www.nowcoder.com/acm/contest/143/D来源:牛客网 题目描述 Kanade has an even number n and a permutati ...
- 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组
链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...
- 牛客多校第五场 E room 二分图匹配 KM算法模板
链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...
随机推荐
- k8s-1.16 二进制安装
环境机器配置: 172.16.153.70 master 172.16.77.121 node1 172.16.77.122 node2 系统初始化 [root@iZbp1c31t0jo4w553hd ...
- leetcode-163周赛-1262-可被3整除的最大和
题目描述: 方法一:动态规划 O(N) class Solution: def maxSumDivThree(self, nums: List[int]) -> int: dp = [0, -1 ...
- Unity NGUI插件
前言:关于Unity中关于UI的插件,我们最开始学的是UGUI,是Unity自带的UI系统,而在Unity版本还没更新出UGUI之前,除了NGUI没有一个更好些的插件,所以人们不得不去选择NGUI去制 ...
- Delphi 常用API 函数列表
Delphi 常用API 函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小AnyPopup 判断屏幕上是否存在任何弹出式窗口ArrangeIconicWi ...
- Vue学习笔记【12】——过滤器
概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的尾部,由 ...
- 【多线程】volatile
Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...
- luoguP2590 [ZJOI2008]树的统计 [树链剖分] [TLE的LCT]
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- 状态压缩dp增量统计贡献——cf1238E(好题)
这题的状态设计非常巧妙,因为dp[S]表示的并非当前正确的值,而是维护一个中间量,这个中间量在到达末状态时才正确 当然官方的题解其实更加直观,只不过理解起来其实有点困难 /* 给定一个串s,字符集为2 ...
- AcWing 204. 表达整数的奇怪方式 (线性同余方程组)打卡
给定2n个整数a1,a2,…,ana1,a2,…,an和m1,m2,…,mnm1,m2,…,mn,求一个最小的整数x,满足∀i∈[1,n],x≡mi(mod ai)∀i∈[1,n],x≡mi(mod ...
- thinkphp5.1调用七牛云SDK上传文件
thinkphp5.0 class Upload { public static function image(){ if(empty($_FILES['file']['tmp_name'])){ e ...