典型的状压思想

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

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

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

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

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

注意使用double

#include <cstdio>
#include <map>
#define ll unsigned int
using namespace std;
const ll con=(1<<25)+(1<<23)+(1<<22);
int n,k;
char s[35];
double ret=0;
int cct=0;
map <ll,double> M;
double f[con];
inline double max(double x,double y)
{
	return x>y?x:y;
}
inline ll erase(ll sit,int pos)
{
	ll temp=sit>>(pos-1);
	temp<<=(pos-1);
	ll ret=sit^temp;
	sit>>=pos;
	sit<<=(pos-1);
	ret|=sit;
	return ret;
}
inline int cot(ll sit)
{
	int cyt=0;
	for(int i=0;i<n-k;i++)
	{
		if((1<<i)&sit)
		{
			cyt++;
		}
	}
	return cyt;
}
double dfs(int dep,ll sit)
{
	if(sit<con&&f[sit])
	{
		return f[sit];
	}else if(M[sit])
	{
		return M[sit];
	}
	if(dep==k+1)
	{
		double tot=(double)cct-cot(sit);
		return tot;
	}
	double temp=0;
	for(int i=1;i<=n-dep+1;++i)
	{
		int ri=n+2-i-dep;
		double tt=0;
		tt=max(tt,dfs(dep+1,erase(sit,i)));
		tt=max(tt,dfs(dep+1,erase(sit,ri)));
		temp+=tt;
	}
	if(sit<con)
	{
		return f[sit]=temp/(double)(n-dep+1);
	}else
	{
		return M[sit]=temp/(double)(n-dep+1);
	}
}
int main()
{
	freopen("v.in","r",stdin);
	freopen("v.out","w",stdout);
  	scanf("%d%d",&n,&k);
  	scanf("%s",s+1);
	ll ori=0;
  	bool flag=0;
	for(int i=1;i<=n;++i)
    {
      	if(s[i]=='W')
		{
		  	ori|=1;
			cct++;
		}
	    if(s[i]!=s[i-1]&&i!=1)
    	{
	    	flag=1;
	    }
		ori<<=1;
	}
	if(k==0)
	{
		printf("0.000000000\n");;
		return 0;
	}
	if(k==n)
	{
		printf("%.10lf\n",(double)cct);
		return 0;
	}
	if(!flag)
	{
		if(s[1]=='W')
		{
			printf("%.10lf\n",(double)k);
		}else
		{
			printf("0.000000000\n");
		}
		return 0;
	}
	ori>>=1;
    ori|=(1<<n);
    printf("%.10lf\n",(double)dfs(1,ori));
    return 0;
}

雅礼 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. 《shiro》视频目录---1、权限管理-shiro

    \day01_shiro\0323\10realm支持散列.avi;\day01_shiro\0323\1权限管理原理.avi;\day01_shiro\0323\2权限管理解决方案.avi;\day ...

  2. ReentrantLock(重入锁)的使用

    //效果和synchronized一样,都可以同步执行,lock方法获得锁,unlock方法释放锁public class MyService { private Lock lock = new Re ...

  3. python编程 之 json包

    1,json是什么? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. 我的理解就是:json是一种统一的格式化的文件,比如,一个jso ...

  4. 使用grep排除空行和注释行

    grep的排除选项为 -v排除空行的命令是:grep -v '^$' filename排除以#注释的命令是:grep -v '^#' filename 结合起来就是,既排除空行又排除注释行的命令gre ...

  5. Linux三剑客之awk命令

    awk简介 awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK 的确拥有自己的语言: AWK 程 ...

  6. Linux系统安全学习笔记(1)-- 文件系统类型

    今天看了一个关于Linux系统安全的视频教程,这个教程有很多的知识点,我会分几篇博文将我的笔记分享出来. 首先是关于Linux文件系统类型的一些知识,Linux有四种常见的文件系统类型(网上大多数是3 ...

  7. JavaScript-简介、ECMAScript5.0

    Javascript简介 web前端有三层: HTML:从语义的角度,描述页面的结构 CSS:从审美的角度,描述样式(美化页面) Javascript:从交互的角度,描述行为(提升用户体验) Java ...

  8. HAProxy详解(三):基于虚拟主机的HAProxy负载均衡系统配置实例【转】

    一.基于虚拟主机的HAProxy负载均衡系统配置实例 1.通过HAProxy的ACL规则配置虚拟主机: 下面将通过HAProxy的ACL功能配置一套基于虚拟主机的负载均衡系统.这里操作系统环境为:Ce ...

  9. 题解-UOJ284 快乐游戏鸡

    Problem uoj 题意大意: 一棵树,点权\(w_i\),每次玩家可以在树上行走,一条边需要\(1\)的时间,只能往儿子走.每次游戏需要从\(s\)到\(t\). 玩家有一个总死亡次数,初始为\ ...

  10. strncpy的用法

    strncpy是C语言的库函数之一,来自C语言标准库,定义于string.h,函数原型是: char *strncpy(char* dest,char* src,size_t n); 把src所指向的 ...