hdu 4778 Gems Fight! 博弈+状态dp+搜索
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html
题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜索
不难发现,无论Alice和Bob以何种方式投掷包裹,他们得到的Magic Stones个数的和$Sum$是一定的,因此只需要计算Alice可以获得的最大的Magic Stones的个数MAXA,则Bob获得的个数为Sum-MAXA,而两者的最大的差为MAXA-(sum-MAXA)为答案。那么如何计算MAXA呢?我们定义状态state为目前包裹的使用情况,如果包裹i被使用则state的二进制的第i位为0,否则为1。我们可以发现如下性质:
Alice和Bob的目的是相同的,即使得获得的Magic Stones的个数最大。唯一的区别就是Alice先手,而Bob后手。如果Alice这一轮没有获得Magic Stone,那么权利转移给Bob,Bob的策略则和Alice在相同的状态state下先手的策略是相同的。从而可以定义dp[state],表示在先手的情况下(无论是Alice还是Bob)能够获得的最大的Magic Stones数目。从而可以使用深度优先的记忆化搜索。对于一个状态$state$,如果第i个包裹还没有被使用,则计算先手把这个包裹投入cooker中所能获得的magic stone的个数gen,如果gen>0则说明可以继续保持先手,获得的Magic Stones得个数等于此次获得和个数加上在下一个状态下先手投掷所能获得的最大的个数。否则的话先手转化为后手,所获得的Magic Stones的个数只能为此状态下所能产生所有的的Magic stones的个数减去先手在下一状态下所能获得的最大的个数。我们用gen表示此次向cooker中投掷i包裹能够获得的magic的个数,cc表示cooker的状态,即各个颜色石头的个数。left表示目前状态下所能产生的所有的Magic stones的个数。
代码如下:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXB = ;
const int MAXC = ;
const int MIN = -;
int g, b, s;
int bag[MAXB][MAXC];
int color[MAXC];
int dp[<<MAXB];
int dfs(int state,int left, int *c)
{
if( state == || left == ) return ;
if( dp[state] != MIN ) return dp[state];
int maxres = MIN;
int maxtmp = ;
for( int i = ; i < b ; i++ )
{
int cc[MAXC];
memset(cc, , sizeof(cc));
int gen = ;
if( state>>i & )
{
for( int j = ; j < g ; j++ )
{
cc[j] = c[j] + bag[i][j];
gen += cc[j]/s;
cc[j] %= s;
}
if( gen > )
{
maxtmp = gen + dfs(state^(<<i), left-gen, cc);
}
else
{
maxtmp = left - dfs(state^(<<i), left, cc);
}
}
maxres = max(maxres, maxtmp);
}
dp[state] = maxres;
return maxres;
}
int main(int argc, char *argv[])
{
while( )
{
scanf("%d%d%d", &g, &b, &s);
if( g == && b == && s == ) return ;
memset(bag, , sizeof(bag));
memset(color, , sizeof(color));
int sum = ;
for( int i = ; i < b ; i++ )
{
int tmpn;
scanf("%d", &tmpn);
while( tmpn -- )
{
int c;
scanf("%d", &c);
bag[i][c-]++;
color[c-]++;
}
}
for( int i = ; i < g ; i++ )
{
sum+=color[i]/s;
}
for( int i = ; i < (<<MAXB) ; i++ )
{
dp[i] = MIN;
}
int cc[MAXC];
memset(cc, , sizeof(cc));
int res = dfs((<<MAXB)-, sum, cc);
printf("%d\n", res-(sum-res));
}
}
hdu 4778 Gems Fight! 博弈+状态dp+搜索的更多相关文章
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- Hdu 4778 Gems Fight! (状态压缩 + DP)
题目链接: Hdu 4778 Gems Fight! 题目描述: 就是有G种颜色,B个背包,每个背包有n个宝石,颜色分别为c1,c2............两个人轮流取背包放到公共容器里面,容器里面有 ...
- HDU 4778 Gems Fight! (2013杭州赛区1009题,状态压缩,博弈)
Gems Fight! Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others)T ...
- hdu 4778 Gems Fight! 状态压缩DP
Gems Fight! Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others)T ...
- HDU 4778 Gems Fight!(DP)
题目链接 当我放弃的时候过了.sb啊,卡常数!!! 换了好几个姿势,本来没写预处理,预处理+俩剪枝,尼玛就过了.. #include <stdio.h> #include <stri ...
- hdu 4778 Gems Fight!
第一次写状压dp-- 题意:http://blog.csdn.net/dyx404514/article/details/15506601 状压dp+博弈吧-- #include<iostrea ...
- hdu 5135(2014广州—状态dp)
t题意:给你n条边,构造任意个三角形,一个三角形恰好只用3条边,每条边只能一次,求面积最大值 思路: 最开始想的是先排序从大到小取,但感觉并不怎么靠谱. 最多12条边,所以可以求出所有可能的三角形面积 ...
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
随机推荐
- AD新建用户、组、OU
#新建用户 import-csv d:\AD\Users.csv | Foreach {New-ADUser -Name $_.Name -Path $_.Path -samAccountName $ ...
- cdoj 92 Journey tarjan/lca 树上点对距离
Journey Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/92 Descri ...
- 反射---Java高级开发必须懂的
理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助. 一.Class类的使用 1.万事万物皆 ...
- php动态调用方法_sux
<form action=""> <input type="hidden" name="mod" id="mo ...
- 项目源码--Android高质量图片浏览器源码
下载源码 技术要点: 1. 浏览所有格式的图片 2. 图片缓存到数据库 3. Sqlite数据库的高级应用 4. 文件夹缩图显示 5. 多点触控技术 6. 动画技术 7. 支持超高清图片 8. ...
- C#_mvc_ajax_return data
假设cshtml文件中是这样的: <script type="text/javascript"> $(document).ready(function(){ $(&qu ...
- javascript笔记07:使用Object类为实例定义方法和属性
function Person() {} Person.prototype = { nickName:"john", , showInfo:function() { return ...
- 西门子PLC两线制,四线制
1 一.对于控制系统模块:两线制,四线制信号都只有两根线接入模件,区别在于: 两线制信号的这两根线一正一负,不带提供信号电流,而且提供供电电压:一般流量,压力,液位等等的信号常用两线制信号,但也要根据 ...
- iOS app 上架的流程与注意点
这里整理了两个关于苹果应用商店上架方面的资料: 一个是app上架的流程,里面包含各个环节的截图,比较详细. 流程介绍链接 (提取码:52a4) 第二个是app上架的一些注意点,这里面主要说的是上架 ...
- mapping 详解3(Meta-Fields)
文档标识相关元数据字段 _index 当执行多索引查询时,可能需要添加特定的一些与文档有关联的索引的子句. _index 字段可以用在 term.terms 查询,聚合(aggregations)操作 ...