BZOJ2681 : 玩游戏2
首先若存在多个连通块,那么答案显然是$+\infty$。
否则以$m$为根,每棵子树的根节点都最多只能放一个金币,且这些子树之间互不干扰。
对于一棵父亲为$m$的子树,最优方案下一定可以将子树剖分成若干条祖先到孙子的链,每条链中每个点$x$往上贡献$\lfloor\frac{v[x]}{2}\rfloor$个金币,且不能贡献到其它链上去,因此一条有$k$个点的链最多可以放$2^k-1$个金币。
设$f[i][j]$表示考虑$i$的子树,$i$所在链里有$j$个点时最多能放的金币数,枚举链的接法转移即可。
时间复杂度$O(n^2)$。
#include<cstdio>
typedef long long ll;
const int N=70;
const ll inf=1LL<<50;
int n,m,i,j,ed,g[N],v[N<<1],nxt[N<<1];char s[N];ll p[N],f[N][N],h[N],ans;
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void up(ll&a,ll b){
if(b>inf)b=inf;
if(a<b)a=b;
}
void dfs(int x,int y){
int i,j,k,u;
for(i=0;i<=n;i++)f[x][i]=-1;
f[x][1]=0;
for(i=g[x];i;i=nxt[i]){
u=v[i];
if(u==y)continue;
dfs(u,x);
for(j=0;j<=n;j++)h[j]=-1;
ll tmp=0;
for(j=1;j<=n;j++)if(~f[x][j]){
up(h[j],f[x][j]+f[u][0]);
up(tmp,f[x][j]+p[j-1]);
}
for(j=1;j<n;j++)if(~f[u][j])up(h[j+1],f[u][j]+tmp);
for(j=0;j<=n;j++)f[x][j]=h[j];
}
for(i=1;i<=n;i++)if(~f[x][i])up(f[x][0],f[x][i]+p[i]);
}
int main(){
for(p[0]=i=1;i<N;i++)up(p[i],p[i-1]*2);
for(i=0;i<N;i++)p[i]--;
while(~scanf("%d%d",&n,&m)){
for(i=1;i<=n;i++)g[i]=0;
for(ed=0,i=1;i<=n;i++){
scanf("%s",s+1);
for(j=1;j<=n;j++)if(s[j]=='Y')add(i,j);
}
if(ed/2!=n-1){
puts("-1");
continue;
}
ans=0;
for(i=g[m];i;i=nxt[i]){
dfs(v[i],m);
up(ans,ans+f[v[i]][0]);
}
if(ans>2000000000)ans=-1;
printf("%lld\n",ans);
}
return 0;
}
BZOJ2681 : 玩游戏2的更多相关文章
- 原生JS实战:写了个一边玩游戏,一边记JS的API的游戏
本文是苏福的原创文章,转载请注明出处:苏福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程序[一边玩游戏,一边记JS的API]是本人的个 ...
- bzoj4730: Alice和Bob又在玩游戏
Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...
- cdoj 1136 邱老师玩游戏 树形背包
邱老师玩游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1136 Desc ...
- win7系统玩游戏不能全屏的解决办法
1.修改注册表中的显示器的参数设置 Win键+R键,打开运行窗口,输入regedit回车,这样就打开了注册表编辑器,然后,定位到以下位置: HKEY_LOCAL_MACHINE\SYSTEM\ ...
- 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备
背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...
- UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>
G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- 【特殊的图+DP】【11月校赛】大家一起玩游戏
大家一起玩游戏 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...
- 洛谷 P4705 玩游戏 解题报告
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
随机推荐
- jar包中File 文件找不到的异常分析与解决
源链接: http://hxraid.iteye.com/blog/483115#comments 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会 ...
- 2、搭建一个简单的Web项目
一.创建一个Web项目: 1.File->new Project->Java->JavaEE->Web Application 2.为项目起名: 3.配置项目:在项目上击右键- ...
- Servlet处理Json请求数据包
request.setCharacterEncoding('UTF-8'); response.setContentType('text/html;charset=UTF-8'); String ac ...
- json 格式化的时候,日期格式化
public class CustomIsoDateTimeConverter : IsoDateTimeConverter { public CustomIsoDateTimeConverter() ...
- Codeforces Round #484 (Div. 2)Cut 'em all!(dfs)
题目链接 题意:给你一棵树,让你尽可能删除多的边使得剩余所有的联通组件都是偶数大小. 思路:考虑dfs,从1出发,若当前节点的子节点和自己的数目是偶数,说明当前节点和父亲节点的边是可以删除的,答案+1 ...
- PC端判断浏览器类型及移动端判断移动设备类型
浏览器代理检测,可以检测出来用户使用的浏览器类型,也可以检测浏览器所在的操作系统 navigator.userAgent (1).判断浏览器类型 var t = navigator.userAgent ...
- UOJ #460 新年的拯救计划
清真的构造题 UOJ# 460 题意 求将$ n$个点的完全图划分成最多的生成树的数量,并输出一种构造方案 题解 首先一棵生成树有$ n-1$条边,而原完全图只有$\frac{n·(n-1)}{2}$ ...
- L1-Day8
1.他就是我昨天见的那个人. [我的翻译]He is a man who I saw him yestorday. [标准答案]He is the man (who(m) /that) I saw y ...
- 【Android入门】一个App学会安卓开发
一.程序项目架构
- rabbitmq - (消息队列) 的基本原理介绍
介绍 MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订 ...