HDU 4778 内存搜索&如压力
鉴于G宝石,B包。和S。S当代表凑齐每种颜色的宝石S我们可以成为哲学家的石头
每个软件包包含N宝石。分别c1,c2.......
然后他们轮流拿包。每个包可以得到一次。宝石出包放在地上。
假设你可以成为魔法石拿着魔法石,次还这个人拿包。没变成则换人。
魔法石的个数就是获得分数,问两人最优的时候分差是多少。
状压记忆化搜索
一共21个包。状压存当前取包的状态
不管如何取,最后获得的魔法石数量一定
dp[i]表示在i状态下。先手能够获得的最高分数
#include "stdio.h"
#include "string.h" int aim,g,b,s;
int dp[1<<22],c[25][10];
int bit[25];
int inf=0x3f3f3f3f; int Max(int a,int b)
{
if (a<b)return b;
else return a;
}
int dfs(int cur,int sum,int temp[])
{
int ans,i,next,j,w,cnt;
int mark[10];
if (cur==aim || sum==0) return 0;
if (dp[cur]!=inf) return dp[cur]; ans=0;
for (i=1;i<=b;i++)
if (cur&bit[i])
{
next=cur^bit[i];
cnt=0;
for (j=1;j<=g;j++)
{
mark[j]=temp[j]+c[i][j];
cnt+=mark[j]/s;
mark[j]%=s;
}
if (cnt>0) w=cnt+dfs(next,sum-cnt,mark);
else w=sum-dfs(next,sum,mark);
ans=Max(ans,w);
}
return dp[cur]=ans;
}
int main()
{
int i,n,x,sum,aim,ans;
int all[10],mark[25];
bit[1]=1;
for (i=2;i<=22;i++)
bit[i]=bit[i-1]*2; while (scanf("%d%d%d",&g,&b,&s)!=EOF)
{
if (g+b+s==0) break;
memset(c,0,sizeof(c));
memset(all,0,sizeof(all));
for (i=1;i<=b;i++)
{
scanf("%d",&n);
while (n--)
{
scanf("%d",&x);
c[i][x]++;
all[x]++;
}
}
sum=0;
for (i=1;i<=g;i++)
sum+=all[i]/s; aim=bit[b+1]-1;
memset(mark,0,sizeof(mark));
memset(dp,inf,sizeof(dp));
ans=dfs(0,0,mark);
printf("%d\n",ans-(sum-ans));
}
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
HDU 4778 内存搜索&如压力的更多相关文章
- hdu 4778 Gems Fight! 博弈+状态dp+搜索
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...
- hdu 4778 Rabbit Kingdom(减少国家)
题目链接:hdu 4778 Rabbit Kingdom 题目大意:Alice和Bob玩游戏,有一个炉子.能够将S个同样颜色的宝石换成一个魔法石.如今有B个包,每一个包里有若干个宝石,给出宝石的颜色. ...
- HDU 4778 状压DP
一看就是状压,由于是类似博弈的游戏.游戏里的两人都是绝对聪明,那么先手的选择是能够确定最终局面的. 实际上是枚举最终局面情况,0代表是被Bob拿走的,1为Alice拿走的,当时Alice拿走且满足变换 ...
- 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 5468(莫比乌斯+搜索)
hdu 5468 Puzzled Elena /*快速通道*/ Sample Input 5 1 2 1 3 2 4 2 5 6 2 3 4 5 Sample Output Case #1: ...
- HDU 4499.Cannon 搜索
Cannon Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- HDU 1045 (DFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意:在不是X的地方放O,所有O在没有隔板情况下不能对视(横行和数列),问最多可以放多少个 ...
- HDU 1180 (BFS搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1180 题目大意:迷宫中有一堆楼梯,楼梯横竖变化.这些楼梯在奇数时间会变成相反状态,通过楼梯会顺便到达 ...
随机推荐
- html练习(5)
这个练习主要简单的展示了据对定位和相对定位: 在此说下html的定位: 1.static定位 这个是默认的方式.对static而言.left和right是不生效的. 2.relative定位(相对定位 ...
- openjpa框架入门_Demo概览(一)
我个人所了解并学习的openjpa日志(一) 最近一直研究openjpa,想把自己所了解的写成日志,和大家一起学习,一起进步. 整个过程,会有一个完整的经过改造过openbook demo可运行. O ...
- Hulu面试题解答——N位数去除K个数字(解法错误sorry)
给定一个N位数,比如12345,从里面去掉k个数字.得到一个N-k位的数.比如去掉2,4,得到135,去掉1,5.得到234.设计算法.求出全部得到的N-k位数里面最小的那一个. 写的代码例如以下,思 ...
- Windows下安装MySQLdb, Python操作MySQL数据库的增删改查
这里的前提是windows上已经安装了MySQL数据库,且配置完成,能正常建表能操作. 在此基础上仅仅需安装MySQL-python-1.2.4b4.win32-py2.7.exe就ok了.仅仅有1M ...
- 【译】ASP.NET MVC 5 教程 - 4:添加模型
原文:[译]ASP.NET MVC 5 教程 - 4:添加模型 在本节中,我们将添加一些管理电影数据库的类,这些类在ASP.NET MVC 应用程序中扮演“Model”的角色. 我们将使用.NET F ...
- redis作为mysql的缓存服务器(读写分离) (转)
一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...
- Android开展:ADT+Eclipse使用错误:Text editor does not have a document provider
Eclipse参加Android sdk源代码 正在使用Eclipse进行Android开发时间,我们经常需要导入sdk源代码来Eclipse中,方便api阅读和查询,详细操作为:ctrl+鼠标左键. ...
- ipconfig /flushdns 清除系统DNS缓存
1.ipconfig /flushdns的作用 ipconfig /flushdns 这是清除DNS缓存用的. 当訪问一个站点时系统将从DNS缓存中读取该域名所相应的IP地址,当查找不到时就会到系统中 ...
- 循环多少次? 【杭电--HDOJ-1799】 附题+具体解释
循环多少次? Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- hdu 3790 (最短路径问题dijkstra)
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起 ...