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}^ ...
随机推荐
- 模块--random
random模块 1 random.random() print(random.random()) 0-1 之间随机小数 不包含1 2 random.uniform(a,b) ...
- 转载-IDEA项目左边栏只能看到文件看不到项目结构
原文-https://blog.csdn.net/weixin_42362985/article/details/80538064 有时IDEA Maven项目打开左侧Project窗口本应该显示项目 ...
- linux Centos7下安装python3及pip3
先去python官网下载python3安装包 执行命令:wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 安装zlib-dev ...
- python多任务抓取图片
import re import urllib.request import gevent def download(image_download, images_path,i): headers = ...
- elk的备份与恢复【转】
elasticsearch提供了快照功能: 1.在elsticsearch的配置文件中定义一个path.repo路径配置 path.repo: ["/elk/my_backup"] ...
- numpy数组取每一列的数据
也可以运用到列表中,a原本是一个列表的嵌套,将a转为了数组进行此操作,可以取固定的值,这就是numpy的好处.
- Resharper使用详解(转)
万恶的360文档 解除复制的限制 Ctrl + Shift + i 打开控制台,也可以鼠标右键,选最后一个检查也可以打开控制台,输入: setInterval = null; //将内置无限循环函数设 ...
- Lua模式匹配
Lua并不使用POSIX规范的正则表达式[4](也写作regexp)来进行模式匹配.主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lu ...
- Python迭代器、生成器
迭代器 iterator # 只要是能被for循环的数据类型 就一定拥有__iter__方法 # 迭代器多了的方法 print(set(dir([].__iter__()))-set(dir([])) ...
- 使用HDFS完成wordcount词频统计
任务需求 统计HDFS上文件的wordcount,并将统计结果输出到HDFS 功能拆解 读取HDFS文件 业务处理(词频统计) 缓存处理结果 将结果输出到HDFS 数据准备 事先往HDFS上传需要进行 ...