CF1316E 【Team Building】

状压dp,感觉比D简单

\(f[i][s]\),表示考虑前\(i\)个人,状态为\(s\)(\(s\)的第\(j-1\)个二进制位表示队员的第\(j\)个位置有没有人)的最大价值

考虑如何转移

 

如果不让第\(i\)个人当队员

  • 如果当前已选为观众的人不足\(k\)个,则一定让它当观众,那么\(f[i][s]\)由\(f[i-1][s]+a_i\)转移来,不过这样做的前提是要先把这\(i\)个人按照他们当观众时的价值排序,从而如果当前观众不到\(k\)个但不选第\(i\)个,就一定会在后面选一个\(j(j>i)\)当观众,\(a_j<a_i\),就没有选第\(i\)个优了
  • 如果已经选了\(k\)个,不能再选直接\(f[i][s]=f[i-1][s]\)

已经选了几个要通过\(s\)确定,也就是\(i-1-s\text{在二进制中1的个数}\) 个人已被选位观众

 

让第\(i\)个人当队员

枚举把\(i\)放在哪一位,如果要将他放在第\(j\)位,则需满足\(s\)的第\(j-1\)个二进制位为1(也就是当前的状态这一个位置有人),那么\(f[i][s]\)可以由\(f[i-1][s \oplus (j-1)]+s_{i,j}\)转移而来

这里异或的意义就是把\(s\)的第\(j-1\)个二进制位从1变0,被转移的状态肯定是第\(j\)个位置没人

那么就可以写出代码了,其实整个思考的最重要部分就在于把\(n\)个人排序,来实现 能被选去当观众就一定选,就能达到最优 的效果,复杂度\(O(np2^p)\)

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<iomanip>
  6. #include<cstring>
  7. #define reg register
  8. #define EN std::puts("")
  9. #define LL long long
  10. inline int read(){
  11. int x=0,y=1;
  12. char c=std::getchar();
  13. while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
  14. while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
  15. return y?x:-x;
  16. }
  17. int n,p,k;
  18. struct data{
  19. int v,id;
  20. LL s[10];
  21. }a[100006];
  22. LL f[100006][130];
  23. inline int cmp(data aa,data aaa){return aa.v>aaa.v;}
  24. int main(){
  25. n=read();p=read();k=read();
  26. for(reg int i=1;i<=n;i++) a[i].v=read(),a[i].id=i;;
  27. for(reg int i=1;i<=n;i++)
  28. for(reg int j=1;j<=p;j++) a[i].s[j]=read();
  29. reg int lim=1<<p;
  30. std::sort(a+1,a+1+n,cmp);
  31. std::memset(f,-1,sizeof f);
  32. f[0][0]=0;
  33. for(reg int i=1;i<=n;i++){
  34. for(reg int s=0;s<lim;s++){
  35. int cnt=0;
  36. for(reg int j=0;j<p;j++)
  37. if(s&(1<<j)) cnt++;
  38. int tmp=i-1-cnt;
  39. if(tmp<k){
  40. if(f[i-1][s]!=-1) f[i][s]=f[i-1][s]+a[i].v;;
  41. }
  42. else f[i][s]=f[i-1][s];
  43. for(reg int j=1;j<=p;j++){
  44. if((s&(1<<(j-1)))&&f[i-1][s^(1<<(j-1))]!=-1)
  45. f[i][s]=std::max(f[i][s],f[i-1][s^(1<<(j-1))]+a[i].s[j]);
  46. }
  47. }
  48. }
  49. std::printf("%lld",f[n][lim-1]);
  50. return 0;
  51. }

CF1316E Team Building的更多相关文章

  1. BZOJ 4742: [Usaco2016 Dec]Team Building

    4742: [Usaco2016 Dec]Team Building Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 16[Su ...

  2. Spoj-BIPCSMR16 Team Building

    To make competitive programmers of BUBT, authority decide to take regular programming contest. To ma ...

  3. BZOJ4742 : [Usaco2016 Dec]Team Building

    如果我们将两个人拥有的牛混在一起,并按照战斗力从小到大排序,同时把第一个人选的牛看成$)$,第二个人选的牛看成$($的话,那么我们会发现一个合法的方案对应了一个长度为$2k$的括号序列. 于是DP即可 ...

  4. 1742. Team building(dfs)

    1742 最小的是找联通块数 最大的找环 一个环算一个 其它的数各算一个 #include <iostream> #include<cstdio> #include<cs ...

  5. [USACO 2016Dec] Team Building

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4742 [算法] 动态规划 用Fi,j,k表示约翰的前i头牛和保罗的前j头牛匹配 , ...

  6. 简单状压dp的思考 - 最大独立集问题和最大团问题 - 壹

    本文参考:CPH ,USACO Guide (大佬请越过,这是初学笔记,不要吐槽内容) 前置知识:位运算基础,动态规划基础 介绍 状态是元素的子集的动态规划算法,可以用位运算来高效的优化. 那么第一道 ...

  7. [Exchange 2013]创建约会和会议

    简介 会议和约会之间的重要区别是,会议有与会者,并且没有约会.约会和会议可以是单实例或属于重复序列,但与会者. 房间或资源中不包括约会,因为它们不需要发送一条消息.在内部,Exchange 使用相同的 ...

  8. USER STORIES AND USE CASES - DON’T USE BOTH

    We’re in Orlando for a working session as part of the Core Team building BABOK V3 and over dinner th ...

  9. 基于AWS的云服务架构最佳实践

    ZZ from: http://blog.csdn.net/wireless_com/article/details/43305701 近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关 ...

随机推荐

  1. Python爬虫系列(一):从零开始,安装环境

    在上一个系列,我们学会使用rabbitmq.本来接着是把公司的celery分享出来,但是定睛一看,celery4.0已经不再支持Windows.公司也逐步放弃了服役多年的celery项目.恰好,公司找 ...

  2. synchronized的锁是针对多线程的

    synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白. Java的synchronized使用方法总结 1. 把synchronized当作函数修饰符时 这也就是同步方法,那这 ...

  3. Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析

    Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...

  4. 基于thinkphp3.2.3开发的CMS内容管理系统 - ThinkPHP框架

    基于thinkphp3.2.3开发的CMS内容管理系统 thinkphp版本:3.2.3 功能: --分类栏目管理 --文章管理 --用户管理 --友情链接管理 --系统设置 目前占时这些功能,更多功 ...

  5. jquary

    1   定义:    jquary是快速简介的Javascrīpt框架 2  分类 :          1)  .js类           源代码的未压缩的可以进行更改的jquary 2) min ...

  6. 详解 通道 (Channel 接口)

    在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...

  7. Java 反射调用方法 - 不跳过安全检查、跳过安全检查和普通方法性能比较测试

    java中反射提供灵活性同时,给运行效率带来了一定影响.写个代码测试一下 package com.xzlf.reflectTest; import java.lang.reflect.Method; ...

  8. 14个快捷键让你的idea飞起来(新手向 + 演示)

    本期盘点一下博主在工作中,常用的13个idea快捷键,这些快捷键基本涵盖了大部分的开发场景,希望可以萌新们的idea使用效率,系统为mac系统 上一步 / 下一步撤销 / 反撤销进入一个类生成方法变量 ...

  9. php 关于 & 引用赋值

    $a = ; $b = ; echo $a . echo $b . $a = $b; echo $a . echo $b . $a = &$b; echo $a . echo $b . $a ...

  10. 关于flex弹性布局

    http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html