CF1183H Subsequences (hard version)

Subsequences (hard version)

https://ac.nowcoder.com/acm/problem/113788

题意:

长度为n的字符串S,现在要找出k个不同的子序列,使得这些序列的总价值最低
一个序列的价值等于删去的字符长度(空串也算子序列)
1≤n≤100,1≤k≤10^12^

题解:

一看就是dp,我们先想想串a可以有多少不同的子序列
dp[i][j]表示前i个字符构造出来的长度为j的子序列数量
转移方程不难得到:
dp[i][j]=dp[i-1][j-1]+dp[i-1][j],(也就是选第i个和不选第i个)
但是这样做是存在重复的
比如satwt,按照上面的方法,st和at就会重复出现,那么怎么才能避免?因为t是重复的,我们只需要取最近的t就行
对于j<i且aj = = ai时,前j-1个字符形成的子序列后面接aj或者ai都是一样的,那么我干脆统一一下,接最近的
我们用pre[ai-'a']表示该字符出现上一次出现的位置
那么转移方程就是
dp [ i ] [ j ] = d p [ i - 1 ] [ j - 1 ] + dp [ i - 1 ] [ j ] - dp [ pre [ ai - 'a' ] - 1 ] [ j - 1 ]
找到最近的一个满足条件的j,然后去掉前j-1的方案数(删去重复数量)

代码:

#include<bits/stdc++.h>
typedef long long ll;
using name

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

牛客每日一题 文章被收录于专栏

记录牛客的每日一题

全部评论

相关推荐

求美团让我成为团孝子:帅不帅的不知道 不过我真是拨号机小姐的狗啊
投递TP-LINK等公司10个岗位
点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务