2019牛客暑期多校训练营(第五场)G subsequence 1【DP】

题意:

给你两个数字n, m, 分别是字符串s,t各自的长度,请问有多少个比t字典序大的s的子序列

题目链接:

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

题解:

要选字典序大的,那么我们有两种选取情况

  • 选长度比他长的,肯定是可以的,我们可以枚举第一个字符的位置,这样后面的数字随便取,只要总长度超过m肯定没问题,则说明后面至少要取m个,可以用组合数学求
  • 选长度和他相等的,那么就要进行DP。dp[i][j]  表示 s串中前i个数字选择了j个比 t串前j个数字大的方案数; f[i][j] 表示  s串中前i个数字选择了j个与t串前j个数字一样大的方案数; 状态转移为:当 s 串第i个数字没被选的时候,d[i][j] = d[i-1][j],f[i][j] = f[i - 1][j];当 s 串第i个数字被选的时候,dp[i][j] += dp[i-1][j-1],如果s[i] > t[j],那么d[i][j] += f[i-1][j-1],如果s[i] = t[j],那么f[i][j] += f[i-1][j-1]。

AC_code:

#include<bits/stdc++.h>
using namespace std;
#define maxn 3005
#define mod 998244353
char s[maxn], t[maxn];
int c[maxn][maxn], dp[maxn][maxn], f[maxn][maxn];

void add(int &x, int y) {
	x = (x + y) % mod;
}

void init() { //组合数预处理
	/*
	c[i][j] 代表  i个数里面取至少j个数字的方案数
	*/
	c[0][0] = 1;
	for(int i = 1; i <= 3000; i++) {
		c[i][0] = c[i][i] = 1;
		for(int j = 1; j < i; j++) {
			add(c[i][j], c[i-1][j-1]+c[i-1][j]);
		}
	}
	for(int i = 1; i<= 3000; i++) {
		for(int j = i; j >= 0; j--) {
			add(c[i][j], c[i][j+1]);
		}
	}
}
int main() {
	int T, n, m;
	init();
	scanf("%d", &T);
	while(T--) {
		scanf("%d %d", &n, &m);
		scanf("%s %s", s+1, t+1);
		int ans = 0;
		for(int i = 1; i <= n; i++) {
			for(int j = 1; j <= m; j++) {
				dp[i][j] = f[i][j] = 0;
			}
		}
		for(int i = 1; i <= n; i++) {
			f[i-1][0] = 1;
			if(s[i] != '0' && (n-i+1 > m)) { //枚举首个字母的位置 且不为0
				add(ans, c[n-i][m]);//后面的数字随便取
			}
			for(int j = 1; j <= min(i, m); j++) {
				add(f[i][j], f[i-1][j]);
				add(dp[i][j], dp[i-1][j]);
				add(dp[i][j], dp[i-1][j-1]);
				if (s[i] > t[j]) {
					add(dp[i][j], f[i-1][j-1]);
				} else if (s[i] == t[j]) {
					add(f[i][j], f[i-1][j-1]);
				}
			}
		}
		add(ans, dp[n][m]);
		printf("%d\n", ans);
	}
}

 

全部评论

相关推荐

看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
程序员牛肉:公平那是对小孩子讲的童话故事,成年人的世界只有能不能接受失败的后果。 你要是能接受面试作弊被发现之后多家公司联合永久拉黑的后果,你就搞。
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务