题解 | E - Removal

Removal

https://ac.nowcoder.com/acm/contest/139/E

E - Removal

首先不考虑去重,可以写出以下 DP,设 表示不去重情况下,考虑前 个数字,删除了 个,且最后一个为数字为 的方案数,有如下转移:

然后拿着这个东西取跑一遍样例,果真是错的,然后研究一下 DP 值,看看重复的都是什么情况。

这里以第一个样例为例,重复的点为去除前两个和后两个的两种情况,从 DP 转移的角度观察这个问题,当 的时候,我们考虑 的情况:

m = 1: 子序列为 "1" 或 "2"
m = 2: 子序列为 ""

然后到了 ,我们会从 转移出一个 "1",从 转移出一个 "1",两个就重复了。

思考归纳一下,设两个序列为 prepre+s[i + 1] 那么前一种情况加上 ,后一种情况不加,就会出现重复。

所以去重的操作就是:

int n, m, k, s[N]; mint dp[N][11][11];
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	while (cin >> n >> m >> k) {
		forn (i, 1, n) cin >> s[i];
		dp[1][0][s[1]] = 1;
		dp[1][1][0] = 1;
		rep (i, 1, n) forn (j, 0, m) {
			if (j) dp[i + 1][j][s[i + 1]] -= dp[i][j - 1][s[i + 1]];
			forn (t, 0, k) {
				dp[i + 1][j][s[i + 1]] += dp[i][j][t];
				if (j < m) dp[i + 1][j + 1][t] += dp[i][j][t];
			}
		}
		mint ans = 0;
		forn (t, 0, k) ans += dp[n][m][t];
		cout << ans.r << '\n';
		forn (i, 1, n) forn (j, 0, m) forn (t, 0, k) 
			dp[i][j][t] = 0;
	}
	return 0;
}
全部评论

相关推荐

等一个offer的菠...:擦,感觉这家hr挺神的,我老早就投简历了,hr也没约面就硬拖,后面我催她才给我打电话。也没给我简历推到业务部门,后来问说已经招到人了,hc给锁了。hc锁了早不说,给我拖了快20天都没约上面,之后告诉我没hc了
点赞 评论 收藏
分享
牛客26538663...:不限量吗,那把token拿出去卖
点赞 评论 收藏
分享
05-23 19:33
重庆大学 Java
只学了传统后端,马上去后端实习了,在想要不要学习agent开发相关的。27秋招和26相比难度如何?
我连备胎都不是却还在...:就暑期实习而言,大厂官宣hc 比 26 多,但是我观察看应该低于 26 的,估计秋招也不简单
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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