题目链接:点击查看

题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去删除下一种字符,而对于每一种字符的删除,一段当前字符组成的连续区间可以一起删除,现在问最小操作数,注意一下,当某段字符被删除后,剩下的字符会进行拼接

题目分析:训练时读错题了,以为是青蛙祖玛那样的删除,然后看 n 那么小,觉得像是区间dp,就没再纠结了(这个样例给的也太水了吧,开局两分钟以为是签到题,冲了一发,然后带歪榜了,阿这)

其实是一道十分水的状压dp,因为不同的字符最多有 20 种,且需要确定一种最优的先后顺序进行删除,所以我们设 dp[ i ] 为第 i 种状态下,二进制为 1 的字符已经被删除掉的最小花费,答案显然就是 dp[ ( 1 << k ) - 1 ] 了

简单讲一下如何转移,假设当前枚举的状态为 i ,对于已经被删除掉的字符就不用管了,对于没有被删除掉的字符,我们统计一下当前状态下,删除掉每种字符的贡献,然后择优转移就好了,统计每种字符的贡献实质上就是统计当前字符被分成了多少段不相邻的区间

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;int dp[(1<<20)+100],id[150],cnt[25];char s[410];int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);memset(id,-1,sizeof(id));memset(dp,inf,sizeof(dp));int n,k;scanf("%d%d",&n,&k); scanf("%s",s+1);int tot=0;for(int i=1;i<=n;i++)if(id[s[i]]==-1)id[s[i]]=tot++;dp[0]=0;for(int i=0;i<1<<k;i++){memset(cnt,0,sizeof(cnt));int pre=-1;for(int j=1;j<=n;j++){if(((i>>id[s[j]])&1)==0&&pre!=id[s[j]]){pre=id[s[j]];cnt[pre]++;}}for(int j=0;j<k;j++)dp[i|(1<<j)]=min(dp[i|(1<<j)],dp[i]+cnt[j]);}printf("%d\n",dp[(1<<k)-1]);return 0;
}

中石油训练赛 - Watch Later(状压dp)相关推荐

  1. 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs

    http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...

  2. 中石油训练赛 - Trading Cards(最大权闭合子图)

    题目大意:给出 n 个卡片,可以自由买卖,且价格都是相同的,再给出 m 个集合,如果已经得到了其中一个集合中的卡片,那么可以获得该集合的收益,问如何操作可以使得收益最大化 题目分析:最大权闭合子图的模 ...

  3. 中石油训练赛 - Swapping Places(字典序最小的拓扑排序)

    题目链接:点击查看 题目大意:给出 s 个字符串表示种类,再给出 m 个朋友关系,表示两个种类的动物是朋友,现在给出一个长度为 n 的种类排列,规定相邻两个是朋友的种类的动物可以交换位置,问如何操作, ...

  4. 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)

    题目大意:在二维平面中给出 n 个点,再给出一个固定大小的圆,问如何放置这个圆可以使其覆盖最多的点 题目分析:首先不难想到一种 n^3 的做法,就是两层循环去枚举两个点,因为两个不同的点就可以确定下来 ...

  5. 中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 ...

  6. 中石油训练赛 - Check List(线段树维护偏序问题)

    题目大意:给出 n 个点,需要计算出满足下列条件的三元对 ( i , j , k ) 的数量: x[ i ] < x[ j ] < x[ k ] y[ k ] > y[ i ] &g ...

  7. 中石油训练赛 - Bad Treap(数学)

    题目链接:点击查看 题目大意:给出笛卡尔树的定义,现在要求给出 n 个点对 ( x , sin( x ) ),使得笛卡尔树的高度尽可能大 题目分析:如果想让笛卡尔树的高度尽可能大,令其退化为一条链即可 ...

  8. 中石油训练赛 - High Load Database(二分+记忆化)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次询问,每次询问给出一个阈值 x ,问最少将数列分割成多少段,可以使得每一段的总和都不超过 x,无解的话输出 Impossible ...

  9. 中石油训练赛 - Plan B(点双缩点+树形dp)

    题目大意:给出一张 n 个点 m 条边的无向连通图,现在有某些点被标记了,问能否通过删除某个未被标记的点,使得删除该点后的数个互不相交的连通块中,至少存在一个联通块中不含有被标记的点 题目分析:首先不 ...

最新文章

  1. Cocos2d-x手机游戏开发行业背景分析
  2. SASE — Overview
  3. jsoncpp在vs2013上的编译
  4. 运营管理最新版史蒂文森_运营管理-史蒂文森stevenson各章课后习题答案
  5. 从Gradle自动将工件提升到Maven Central
  6. Supermap 组合单值专题图与标签专题图演示样例
  7. Eclipse直接运行算法第4版例子(重定向和读取指定路径文件)
  8. promise用法_【JavaScript 教程】异步操作——Promise 对象
  9. ntext字段的替换处理示例--全表替换(作者:邹建)
  10. 【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)
  11. Java数组的三种打印方式
  12. 编码:隐匿在计算机软硬件背后的语言(勘误)
  13. 超级计算机运算中心,中国科学技术大学超级计算中心
  14. wetool 接入图灵机器人_wetool企业版wetool支持微信版本-免费版
  15. 自定义Spark累加器
  16. GC参数解析 UseSerialGC、UseParNewGC、UseParallelGC、UseConcMarkSweepGC
  17. 昨天同事lastday,把前端测试包扔线上去了
  18. linux 心脏滴血漏洞,心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南))...
  19. 财报对比:GREE和DeNA由来已久的竞争
  20. 华为过程可信cib是指_【华为云技术分享】如何做一个优秀软件-可扩展的架构,良好的编码,可信的过程...

热门文章

  1. 非关系型数据库(非RDBMS)介绍
  2. 内存泄漏与内存溢出的区别
  3. Elastic-Job中的ScriptJob
  4. 任务调度之Quartz2
  5. Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?
  6. 如何防止机器模拟请求
  7. 在consumer中调用provider服务
  8. SpringBoot_日志-SpringBoot默认配
  9. 模拟实现单链表(三级)
  10. SpringBoot 数据验证错误处理