CF1183H Subsequences (hard version)

题意:

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

题解:

一看就是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 namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1e4;
int pre[maxn],dp[maxn][maxn],ans;
string a;
int main()
{int n,k;cin>>n>>k>>a;for(int i=0;i<=n;i++){dp[i][0]=1;//空串 }for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){dp[i][j]+=dp[i-1][j-1]+dp[i-1][j];if(pre[a[i-1]-'a'])dp[i][j]-=dp[pre[a[i-1]-'a']-1][j-1];//	if(dp[i][j]>k)dp[i][j]=k;}pre[a[i-1]-'a']=i;} for(int i=n;i>=0;i--){int x=min(k,dp[n][i]);k-=x;//价值ans+=x*(n-i); }if(k)cout<<-1;else cout<<ans;
}
/*
a
ad
af*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P7888-「MCOI-06」Distinct Subsequences【dp】

正题 题目大意 给出一个长度为nnn的字符串aaa&#xff0c;求它的所有子序列的本质不同子序列个数。 1≤n≤1061\leq n\leq 10^61≤n≤106 解题思路 考虑每个子序列产生的贡献&#xff0c;为了防止算重我们一个只统计走子序列自动机上的边的子序列&#xff0c;也就是说对于TTT…

微软携手 Docker 打造 CNAB,分布式应用来了!

微软中国MSDN 前天Microsoft Connect(); 2018发布的众多最新科技&#xff0c;都让全球开发者惊艳不已。其中一项最令开发者瞩目并迫不及待——微软联合Docker发布了云本地应用捆绑包&#xff08;Cloud Native Application Bundle&#xff0c;以下简称CNAB&#xff09;&#xff…

9.4 模拟

前言 175分 60100150 T3和T4做的不好 T4没有理解题目的意思…qwq T3暴力似乎挂了… 但T1和T2还是不戳的 T1打表找规律的方法也许更为有效 考场 先看题。 药丸。。 T3、4甚至根本没有看懂… T1和T2也感觉挺玄乎的 有一种爆零的预感 8&#xff1a;10 先看T1 推了推似乎还是有…

P4135 作诗

P4135 作诗 题意&#xff1a; 给定 n 个不大于 c 的正整数 a1…an 和 m 组询问&#xff0c;每次问 [l,r] 中有多少个数出现正偶数次。 对于每次询问&#xff1a; 设上一个询问的答案为 ans&#xff08;第一个询问时 ans0&#xff09;&#xff0c;令L(lans)mod n1&#xff0c;…

[C++]试一试结构体struct node的构造函数

可直接点击跳转到构造函数处结构体概念定义结构体定义结构体及结构体变量结构体变量的特点成员调用成员函数调用结构体的构造函数Upd1Upd2Upd3结构体概念 在实际问题中&#xff0c;一组数据往往具有不同的数据类型。 例如&#xff1a;人口大普查时&#xff0c;需要记录每一个人…

CSP-S 2021 退役记

写的比较草率&#xff0c;但的确是真实感受。 10.23 回寝室前敲了一个 dinic 板子&#xff0c;觉得不会考。。。 10.24 8:00 起床&#xff0c;还好今天宿管不在&#xff0c;可以起的晚一点。 吃了早饭来机房颓废。 10:00 似乎考前反而不知道该如何复习了&#xff0c;翻了翻以前…

Ybtoj-排列计数【矩阵乘法,分块幂】

正题 题目链接:http://noip.ybtoj.com.cn/contest/596/problem/1 题目大意 TTT组询问给出nnn求有多少个nnn的排列满足第一个是111并且相邻的差不超过222。 1≤T≤106,1≤n≤1091\leq T\leq 10^6,1\leq n\leq 10^91≤T≤106,1≤n≤109 解题思路 考虑一下如果我们要不断向前填满…

[多校联考-西南大学附中]切面包(线段树/概率与期望)+ Slow Path Finding Algorithm(拓扑排序/DP)+ 分数转化(数论)

文章目录T1&#xff1a;分数转换题目题解代码实现T2&#xff1a;Slow Path Finding Algorithm题目题解代码实现T3&#xff1a;切面包题目题解代码实现T1&#xff1a;分数转换 题目 Time limit: 1.5 seconds Memory limit: 512 megabytes 给定一个十进制小数&#xff0c;请你…

P3992 [BJOI2017]开车

P3992 [BJOI2017]开车 题意&#xff1a; 题解&#xff1a; 我们要先将问题转换 圈是车&#xff0c;x是加油站。红色部分为车移动的路线 数组a是车数量的前缀和 数组b是加油站的前缀和 而a[i]与b[i]的差的绝对值就是对应的红色路被走的次数 现在车发生位置移动&#xff0c;b数…

IdentityServer4-MVC+Hybrid实现Claims授权验证(四)

上节IdentityServer4-客户端的授权模式原理分析&#xff08;三&#xff09;以对话形式&#xff0c;大概说了几种客户端授权模式的原理&#xff0c;这节重点介绍Hybrid模式在MVC下的使用。且为实现IdentityServer4从数据库获取User进行验证&#xff0c;并对Claim进行权限设置打下…

9.05 模拟

文章目录前言考场复盘T2T4总结前言 290分 1003010060 整体来说还不错&#xff0c;没有挂分 但是T2应该可以拿到值域[1,000]的第二档写到60分的 一部分原因也是给T2的时间有点少 &#xff08;十分钟&#xff09; 本次第一次尝试了在考场上对拍 效果还是不错的&#xff0c;并不会…

李超线段树

李超线段树可以用来维护平面上的线段(但是要求 \(x\) 或 \(y\) 其中一维比较小&#xff0c;在 \(10^5\) 及以内)。 称一条线段能成为区间 \([l,r]\) 中的最优线段&#xff0c;当且仅当&#xff1a; 该线段的定义域完整覆盖了区间 \([l,r]\) &#xff1b; 该线段在区间中点处最…

2021牛客OI赛前集训营-树数树【树上启发式合并,堆】

正题 题目链接:https://ac.nowcoder.com/acm/contest/20107/C 题目大意 给出nnn个点的一棵树&#xff0c;求一个最长的序列使得数字互不相同且相邻编号节点的都是祖孙关系。 1≤n≤105,1≤T≤51\leq n\leq 10^5,1\leq T\leq 51≤n≤105,1≤T≤5 解题思路 wx,iw_{x,i}wx,i​表…

漫谈何时从单体架构迁移到微服务?

面对微服务如火如荼的发展&#xff0c;很多人都在了解&#xff0c;学习希望能在自己的项目中帮得上忙&#xff0c;当你对微服务的庐山真面目有所了解后&#xff0c;接下来就是说服自己了&#xff0c;到底如何评估微服务&#xff0c;什么时候使用微服务&#xff0c;什么时间点最…

模版:线段树合并+线段树分裂

文章目录前言合并代码分裂代码前言 话说天下之树&#xff0c;分久必合&#xff0c;合久必分 合并 所谓合并&#xff0c;就是把两个树合并 以把B树合并到A树为例 如果A没有该节点&#xff0c;改成B的该节点返回 如果B没有该节点&#xff0c;直接返回 否则递归合并子树&#xff…

2021牛客OI赛前集训营-方格计数【计数,dp】

正题 题目链接:https://ac.nowcoder.com/acm/contest/20107/B 题目大意 给出一个whw\times hwh的网格图&#xff0c;然后要求在上面选出nnn个格点&#xff0c;使得它们在一条直线上且两两之间距离不小于ddd。 1≤T≤20,1≤w,h,d≤500,1≤n≤501\leq T\leq 20,1\leq w,h,d\leq…

可持久化并查集

蒟蒻比较菜&#xff0c;现在才学。。。 P3402 可持久化并查集 其实就是魔改的主席树啦&#xff0c;记录每个点的直接父亲与这棵子树的大小。 合并的时候不用路径压缩&#xff0c;直接暴力跳父亲&#xff0c;\(O(\log^2)\) 找到祖先&#xff0c;之后启发式合并(启发式合并的平均…

[CSP-S Day1,Day2 游记]提高组考后总结及学习编程C++以来的心得体会

怀着沉重而感慨的心情写下了这篇blog考试中暴露的问题Day1Day2综上解决方法学习历程及以来的心得体会职业精神这篇博客我可能会写好几天&#xff0c;我jio得这篇博客对我的学习历程以及态度产生深刻影响考试中暴露的问题 首先先说这次提高组考试的每道题所遇到的各种问题吧 Da…

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

上篇文章介绍了基于Ids4密码授权模式&#xff0c;从使用场景、原理分析、自定义帐户体系集成完整的介绍了密码授权模式的内容&#xff0c;并最后给出了三个思考问题&#xff0c;本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的&#xff0c;如何验证access_t…

树的应用:括号树

传送门 文章目录解析代码解析 没有做出来。。。 一开始看到了一个&#xff08;自以为&#xff09;很好的性质&#xff0c;再加上之前做一些括号相关题的刻板印象&#xff0c;导致这题没掉了… 我的角度和正解完全背道而驰了 放下乱七八糟的前缀和与st’表&#xff0c;回归朴素…