P1777 帮助_NOI导刊2010提高(03)

题目描述

Bubu的书架乱成一团了!帮他一下吧!

他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如,如果书的高度是30,30,31,31,32,那么混乱值为3,30,32,32,31的混乱度也是3,但31,32,31,32,31的混乱度是5-,这实在是太乱了。

Bubu想尽可能地减少混乱度,但他有点累了,所以他决定最多取出k本书,再随意将它们放到书架上。你能帮助他吗?

输入输出格式

输入格式:

最多会有20组测试数据。每组测试数据开头为两个整数n,k(l≤k≤n≤100),表示总共有n本书,最多可以进行k次搬书操作。接下来一行有n个整数,表示每本书的高度,从左到右。每本书的高度是25到32间的整数。最后一组数据后有一行n=k=0。

输出格式:

对于每一组数据,输出Case标号和最终最小的混乱度。在每组数据后打印一个空行。


我们发现,对于拿出去的书是可以随便放的,因为我们可以最后处理它们。

很显然要做DP,顺序可以直接从左到右,满足无后效性。需要最后一个书的编号,以便后面使用。当然取出了几本也得压进状态。

为了处理拿出去的书,我们得把书的状态集合给存储下来。因为拿出去的书拿走以后,可能在原书架里面没有了,最后要根据状态放回来。

方程:

\(dp[i][j][sta][l]\)表示\(i\)位置第\(j\)次换书之前的书的状态集合为\(sta\)当前书的集合最后一本为\(l\)


Code:

  1. #include <cstdio>
  2. #include <cstring>
  3. const int N=104;
  4. const int inf=0x3f3f3f3f;
  5. int min(int x,int y){return x<y?x:y;}
  6. int dp[2][N][1<<10][10],n,k,r,a[N];
  7. void DP()
  8. {
  9. for(int i=1;i<=n;i++)//位置
  10. {
  11. memset(dp[i&1],0x3f,sizeof(dp[i&1]));
  12. for(int j=0;j<=min(k,i);j++)//拿走了几个
  13. for(int sta=0;sta<(1<<r);sta++)//前面的状态,这个没填
  14. for(int l=0;l<=r;l++)//末尾书本
  15. if(!l||(sta>>l-1)&1)
  16. {
  17. dp[i&1][j][sta|(1<<a[i]-1)][a[i]]=min(dp[i&1][j][sta|(1<<a[i]-1)][a[i]]
  18. ,dp[i-1&1][j][sta][l]+(l!=a[i]));//不拿
  19. if(j)
  20. dp[i&1][j][sta][l]=min(dp[i&1][j][sta][l],dp[i-1&1][j-1][sta][l]);//拿走
  21. }
  22. }
  23. }
  24. int cal(int x)
  25. {
  26. int cnt=0;
  27. while(x)
  28. {
  29. cnt++;
  30. x-=x&-x;
  31. }
  32. return cnt;
  33. }
  34. int main()
  35. {
  36. scanf("%d%d",&n,&k);
  37. int cnt=0;
  38. while(n&&k)
  39. {
  40. int sta=0;
  41. r=0;cnt++;
  42. for(int i=1;i<=n;i++)
  43. {
  44. scanf("%d",a+i);
  45. a[i]-=24;
  46. r=r>a[i]?r:a[i];
  47. sta|=1<<a[i]-1;
  48. }
  49. memset(dp[0],0x3f,sizeof(dp[0]));
  50. dp[0][0][0][0]=0;
  51. DP();
  52. int ans=inf;
  53. for(int i=1;i<=k;i++)
  54. for(int j=0;j<(1<<r);j++)
  55. for(int l=1;l<=r;l++)
  56. if(dp[n&1][i][j][l]!=inf)
  57. ans=min(ans,dp[n&1][i][j][l]+cal(sta-j));
  58. printf("Case %d: %d\n\n",cnt,ans);
  59. scanf("%d%d",&n,&k);
  60. }
  61. return 0;
  62. }

2018.7.6

洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告的更多相关文章

  1. 洛谷 P1769 淘汰赛制_NOI导刊2010提高(01)

    P1769 淘汰赛制_NOI导刊2010提高(01) 题目描述 淘汰赛制是一种极其残酷的比赛制度.2n名选手分别标号1,2,3,…,2^n-1,2^n,他们将要参加n轮的激烈角逐.每一轮中,将所有参加 ...

  2. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  3. [洛谷P1801]黑匣子_NOI导刊2010提高(06)

    题目大意:两个操作:向一个可重集中加入一个元素:询问第$k$大的数($k$为之前询问的个数加一) 题解:离散化,权值线段树直接查询 卡点:无 C++ Code: #include <cstdio ...

  4. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)

    题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两种: ...

  5. 洛谷 P1801 黑匣子_NOI导刊2010提高(06) 题解

    昨晚恶补了一下二叉堆的内容 然后就找了几个二叉堆的题来做awa 然后发现用二叉堆做这题复杂度是O(nlogn) 但是有O(n)的解法 (某大佬这么说) 思路大概就是: 利用一个大根堆一个小根堆来维护第 ...

  6. 洛谷 P1950 长方形_NOI导刊2009提高(2)

    传送门 思路 首先定义\(h\)数组,\(h[i][j]\)表示第\(i\)行第\(j\)列最多可以向上延伸多长(直到一个被用过的格子) 然后使用单调栈算出 \(l_i\)和 \(r_i\) ,分别是 ...

  7. 洛谷 P1767 家族_NOI导刊2010普及(10)

    题目描述 在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝,但同一个家族的人不一定有相同姓氏.现在给你岛上的 ...

  8. 洛谷——P1767 家族_NOI导刊2010普及(10)

    P1767 家族_NOI导刊2010普及(10) 题目描述 在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝 ...

  9. 洛谷 P1765 手机_NOI导刊2010普及(10)

    题目描述 一般的手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 # 要按出英文字母就必须要按数字键多下.例如要按出 ...

随机推荐

  1. 402. Remove K Digits/738.Monotone Increasing Digits/321. Create Maximum Number

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  2. 中国的互联网企业逐步走向“单一企业多样化,商业生态同质化”,美国的互联网企业则会走向“单一企业专业化,商业生态多样化”:3.5星|《VUCA时代,想要成功,这些原则你一定得明白》

    VUCA时代,想要成功,这些原则你一定得明白(<哈佛商业评论>增刊) <哈佛商业评论>的10篇文章的合集.主题是VUCA时代,也就是当前复杂多变难预测的时代.大部分文章都是点到 ...

  3. vue mock(模拟后台数据) 最简单实例(一)——适合小白

    开发是前后端分离,不需要等待后台开发.前端自己模拟数据,经本人测试成功. 我们在根目录新建存放数据的json文件,存放我们的数据data.json //data.json{ "status& ...

  4. 如何判断Map中的key或value是什么类型

    在上班写工具类时,遇到了一个问题,将xml文件的节点都放入map容器中时,map的value也是一个map,导致取map的value时,需要判断这个value的数据类型,用到了一下说的这些知识: 对于 ...

  5. MYSQL数据库与Emoji表情的故事

    问题背景 手机上众多输入法和键盘支持输入 emoji 表情,给早期设计的程序造成了越来越多的干扰. 移动端购物的流行,2018 年 "双十一"全网移动端交易达到 93.6% 微信年 ...

  6. Java面试中的Spring方面问题

    1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5发布于 2007 年.这是第一个支持注解的版本.Spring 3 ...

  7. oracle varchar2改成大字段类型clob,读取大字段内容

    http://blog.csdn.net/cai7095576/article/details/23999549

  8. Javascript实现大整数加法

    记得之前面试还被问到过用两个字符串实现两个大整数相加,当时还特别好奇好好的整数相加,为什么要用字符串去执行.哈哈,感觉当时自己还是很无知的,面试官肯定特别的无奈.今天在刷算法的时候,无意中看到了为什么 ...

  9. 重温servlet①

    Servlet是单例的,是线程不安全的.比较灵活,但是容易会使两个线程产生错误 类由我们自己来写,对象由服务器生成,方法由服务器自己调用.   一个servletconfig对象对应着一段web.xm ...

  10. BeanCreationException报错启动不起来(jar包冲突)

    一月 23, 2015 3:46:13 下午 org.apache.catalina.core.AprLifecycleListener init 信息: The APR based Apache T ...