典型的状压思想

设0表示黑球,1表示白球,用一串01序列代表剩下的球的状态,记f[i]表示在i状态下取球的最大期望

那么可以利用记忆化搜索更新,每一层枚举可能拿走的球然后向下搜索,同时记忆化即可

在状态中删去一个点可以利用位运算实现

同时要注意一个问题,就是状态0010和状态010并不是相同的状态,但是如果不做处理在记忆化的过程中很可能把他俩算成相同的状态,所以我们在初始状态最前面放一个1,这样就可以区分上述两种状态了

还有就是本题卡常卡的很厉害,所以对比较小的状态我们用数组,对过大的状态再使用map来操作即可

注意使用double

  1. #include <cstdio>
  2. #include <map>
  3. #define ll unsigned int
  4. using namespace std;
  5. const ll con=(1<<25)+(1<<23)+(1<<22);
  6. int n,k;
  7. char s[35];
  8. double ret=0;
  9. int cct=0;
  10. map <ll,double> M;
  11. double f[con];
  12. inline double max(double x,double y)
  13. {
  14. return x>y?x:y;
  15. }
  16. inline ll erase(ll sit,int pos)
  17. {
  18. ll temp=sit>>(pos-1);
  19. temp<<=(pos-1);
  20. ll ret=sit^temp;
  21. sit>>=pos;
  22. sit<<=(pos-1);
  23. ret|=sit;
  24. return ret;
  25. }
  26. inline int cot(ll sit)
  27. {
  28. int cyt=0;
  29. for(int i=0;i<n-k;i++)
  30. {
  31. if((1<<i)&sit)
  32. {
  33. cyt++;
  34. }
  35. }
  36. return cyt;
  37. }
  38. double dfs(int dep,ll sit)
  39. {
  40. if(sit<con&&f[sit])
  41. {
  42. return f[sit];
  43. }else if(M[sit])
  44. {
  45. return M[sit];
  46. }
  47. if(dep==k+1)
  48. {
  49. double tot=(double)cct-cot(sit);
  50. return tot;
  51. }
  52. double temp=0;
  53. for(int i=1;i<=n-dep+1;++i)
  54. {
  55. int ri=n+2-i-dep;
  56. double tt=0;
  57. tt=max(tt,dfs(dep+1,erase(sit,i)));
  58. tt=max(tt,dfs(dep+1,erase(sit,ri)));
  59. temp+=tt;
  60. }
  61. if(sit<con)
  62. {
  63. return f[sit]=temp/(double)(n-dep+1);
  64. }else
  65. {
  66. return M[sit]=temp/(double)(n-dep+1);
  67. }
  68. }
  69. int main()
  70. {
  71. freopen("v.in","r",stdin);
  72. freopen("v.out","w",stdout);
  73. scanf("%d%d",&n,&k);
  74. scanf("%s",s+1);
  75. ll ori=0;
  76. bool flag=0;
  77. for(int i=1;i<=n;++i)
  78. {
  79. if(s[i]=='W')
  80. {
  81. ori|=1;
  82. cct++;
  83. }
  84. if(s[i]!=s[i-1]&&i!=1)
  85. {
  86. flag=1;
  87. }
  88. ori<<=1;
  89. }
  90. if(k==0)
  91. {
  92. printf("0.000000000\n");;
  93. return 0;
  94. }
  95. if(k==n)
  96. {
  97. printf("%.10lf\n",(double)cct);
  98. return 0;
  99. }
  100. if(!flag)
  101. {
  102. if(s[1]=='W')
  103. {
  104. printf("%.10lf\n",(double)k);
  105. }else
  106. {
  107. printf("0.000000000\n");
  108. }
  109. return 0;
  110. }
  111. ori>>=1;
  112. ori|=(1<<n);
  113. printf("%.10lf\n",(double)dfs(1,ori));
  114. return 0;
  115. }

雅礼 noip2018 模拟赛day3 T2的更多相关文章

  1. 雅礼 noip2018 模拟赛 day3 T3

    典型树形dp 这里,我们应该看到一些基本性质: ①:如果这个边不能改(不是没有必要改),我们就不改,因为就算改过去还要改回来,显然不是最优的 注意:"不能改"是指边的性质和要求的相 ...

  2. NOIP2018 模拟赛(二十二)雅礼NOI

    Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...

  3. [NOIP2018模拟赛10.16]手残报告

    [NOIP2018模拟赛10.16]手残报告 闲扯 炉石乱斗模式美滋滋啊,又颓到好晚... 上来T2先敲了树剖,看T1发现是个思博DP,然后没过大样例,写个暴力发现还是没过大样例!?才发现理解错题意了 ...

  4. [NOIP2018模拟赛10.22]咕咕报告

    闲扯 这是篇咕咕了的博客 考场上码完暴力后不知道干什么,然后忽然发现这个T1好像有点像一道雅礼集训时讲过的CF题目 Rest In Shades ,当时那道题还想了挺久不过思路比较妙,于是我就也\(y ...

  5. [雅礼NOIP2018集训 day4]

    感觉状态极差啊,今天居然爆零了 主要是以下原因: 1.又是T1看错题肝了两个小时,发现题意理解错误瞬间心态爆炸 2.T2交错了文件名 3.T3暴力子任务和正解(假的)混在一起,输出了两个答案 都想为自 ...

  6. [NOIP2018模拟赛10.18]自闭报告

    闲扯 这一天,菜鸡RyeCatcher又想起来了被毒瘤题支配的恐惧 今天比较好玩,还是ljy提醒才发现文件夹里有题面...不知道外面的人什么时候才发现 看完了题面,又回到了雅礼啥题也不会写的感觉 T1 ...

  7. [NOIP2018模拟赛10.23]发呆报告

    闲扯 考场看了眼题目感觉很难,一个小时敲完了所有暴力...嗯然后就在那里发呆什么事也没做 T3考场上把数据结构想了个遍都不会完成1操作,现在看这种思路其实之前也接触过... 比较玄学的一件事情就是T1 ...

  8. [NOIP2018模拟赛10.20A]挂分报告

    闲扯 先看看了B组,T1 ZROI刚好讲过一个性质原根一般很小的,直接枚举;T2一眼二分然后似乎状压 T3没看 然后上来A组题,T1 flow这名字...网络流?! T1题面非常的社会主义核心价值观, ...

  9. [NOIP2018模拟赛10.25]瞎搞报告

    闲扯 最近有点颓,都修到好晚,早上起来和吔shi一样难受 忍着困意把题面看完,发现啥也不会,又是一场写暴力的模拟赛 T1发现似乎可以DP,顺手码了个 T2像个最小瓶颈路板子,但是只做过N^2算法的.. ...

随机推荐

  1. Android RecyclerView 瀑布流滑动到最后自动加载更多

    mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener(){ //用来标记是否正在向最后一个滑动,既是否向下滑动 bool ...

  2. php编程 之 php基础三

    1,php里的while循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. while实例: <html> <body> <?php $i=1; wh ...

  3. P2805 [NOI2009]植物大战僵尸

    题目地址:P2805 [NOI2009]植物大战僵尸 最大权闭合子图 若有向图 \(G\) 的子图 \(V\) 满足: \(V\) 中顶点的所有出边均指向 \(V\) 内部的顶点,则称 \(V\) 是 ...

  4. Python open() 函数

    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=T) 模式 描述 r 以只读方 ...

  5. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  6. Linux只读账号配置【转】

    整个配置的命令如下(主要使用了:Linux bash受限的shell(RESTRICTED SHELL)) 步骤#1.创建只读shell(这步可以省略) ln -s /bin/bash /bin/rb ...

  7. python zip文件压缩和解压

    压缩 import shutil zipOutputName = "1234" # 输出1234.zip fileType = "zip" # 文件类型zip ...

  8. Linux下编写和加载 .ko 文件(驱动模块文件)

    一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...

  9. Mac下更改JDK环境变量配置

    1.打开终端 2.如果你是第一次配置环境变量,可以使用“touch .bash_profile” 创建一个.bash_profile的隐藏配置文件(如果你是为编辑已存在的配置文件,则使用"o ...

  10. 打造一个上传图片到图床利器的插件(Mac版 开源)

    写markdown博客如何将截图快速上传到图床--记一个工具插件的实现(windows版 开源)(2017-05-31 20:23) 打造一个上传图片到图床利器的插件 鉴于写博客截图手动上传到图床的步 ...