字符串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 ...
随机推荐
- Eclipse导入的Maven项目没有Build Path
我导入的是 Signal-Server项目到 Eclipse中,发现 src 文件夹上面没有#号,包视图和语法提示都没有 ~~ 解决方法: 修改 Project Facets 在 项目右键 -> ...
- node-mysql连接数据库
const mysql=require('mysql') const con=mysql.createConnection({ host:'localhost', user:'root', passw ...
- CF734E Anton and Tree
\(\mathtt{CF734E}\) \(\mathcal{Description}\) 给一棵\(n(n\leq200000)\)个节点的树,每个点为黑色或白色,一次操作可以使一个相同颜色的连通块 ...
- 详解 MySQL int 类型的长度值问题
以下是每个整数类型的存储和范围 (来自 mysql 手册)
- leetcode-161周赛-5249-移除无效的括号
题目描述: 自己的提交:O(N) class Solution: def minRemoveToMakeValid(self, s: str) -> str: #from collections ...
- JS时间差(毫秒/天数/月份)
var startDate = "2016-06-06"; var endDate = "2016-08-08"; var start=new Date(sta ...
- BZOJ 3771: Triple(FFT+容斥)
题面 Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: "这把斧头,是不是你的?" 樵夫一看:&qu ...
- AcWing 101. 最高的牛 (差分) 打卡
有 NN 头牛站成一行,被编队为1.2.3…N,每头牛的身高都为整数. 当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方. 现在,我们只知道其中最高的牛是第 PP 头,它的身高是 HH ,剩 ...
- 微信小程序 在使用wx.request时显示加载中
微信小程序中,向后台请求数据是,通常想给用户提示正在加载中,如下图: 我们可以用wx.showLoading(OBJECT),当请求服务器的地方多了,怎么才能不每次都要去调用函数,我们只要对wx.re ...
- 机器学习基石笔记:Homework #3 LinReg&LogReg相关习题
原文地址:http://www.jianshu.com/p/311141f2047d 问题描述 程序实现 13-15 # coding: utf-8 import numpy as np import ...