热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDOJ4778GemsFight!

状压dfs。。。。GemsFight!TimeLimit:2000010000MS(JavaOthers)    MemoryLimit:327680327680K

状压dfs。。。。


Gems Fight!
Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others)
Total Submission(s): 752    Accepted Submission(s): 321





Problem Description


  Alice and Bob are playing "Gems Fight!":
  There are Gems of G different colors , packed in B bags. Each bag has several Gems. G different colors are numbered from color 1 to color G.
  Alice and Bob take turns to pick one bag and collect all the Gems inside. A bag cannot be picked twice. The Gems collected are stored in a shared cooker.
  After a player ,we name it as X, put Gems into the cooker, if there are S Gems which are the same color in the cooker, they will be melted into one Magic Stone. This reaction will go on and more than one Magic Stone may be produced, until no S Gems of the
same color remained in that cooker. Then X owns those new Magic Stones. When X gets one or more new Magic Stones, he/she will also get a bonus turn. If X gets Magic Stone in a bonus turn, he will get another bonus turn. In short,a player may get multiple bonus
turns continuously.
  There will be B turns in total. The goal of "Gems Fight!" is to get as more Magic Stones than the opponent as possible.
  Now Alice gets the first turn, and she wants to know, if both of them act the optimal way, what will be the difference between the number of her Magic Stones and the number of Bob‘s Magic Stones at the end of the game.


 




Input


  There are several cases(<=20).
  In each case, there are three integers at the first line: G, B, and S. Their meanings are mentioned above.
  Then B lines follow. Each line describes a bag in the following format:
  
  n c1 c2 ... cn
  
  It means that there are n Gems in the bag and their colors are color c1,color c2...and color cn respectively.
   0<=B<=21, 0<=G<=8, 0  There may be extra blank lines between cases. You can get more information from the sample input.
  The input ends with G = 0, B = 0 and S = 0.


 




Output


  One line for each case: the amount of Alice‘s Magic stones minus the amount of Bob‘s Magic Stones.


 




Sample Input

3 4 3
2 2 3
2 1 3
2 1 2
3 2 3 1
3 2 2
3 2 3 1
3 1 2 3
0 0 0



 




Sample Output

3
-3
Hint

  For the first case, in turn 2, bob has to choose at least one bag, so that Alice will make a Magic Stone at the end of turn 3, thus get turn 4 and get all the three Magic Stones.



 




Source


2013 Asia Hangzhou Regional Contest


 




Recommend


We have carefully selected several similar problems for you:  4822 4821 4820 4819 4818 


 


#include
#include
#include
#include
#include
using namespace std;
const int maxn=2100000;
int g,b,s,n,hav[30],dp[maxn],sum[maxn],color[30];
bool vis[maxn];
vector bag[30];
int get_i(int x)
{
int ret=0;
memset(color,0,sizeof(color));
for(int i=0;i {
if(x&(1< {
for(int j=0;j {
color[bag[i][j]]++;
}
}
}
for(int i=0;i<10;i++) ret+=color[i]/s;
return ret;
}
int dfs(int state,int num)
{
if(vis[state]) return dp[state];
vis[state]=1;
int ret=0;
for(int i=0;i {
if(state&(1< {
int p=state^(n-1);
int temp=sum[p^(1< if(temp)
{
ret=max(ret,temp+dfs(state^(1< }
else
{
ret=max(ret,num-dfs(state^(1< }
}
}
return dp[state]=ret;
}
int main()
{
while(scanf("%d%d%d",&g,&b,&s)!=EOF&&(g+b+s))
{
n=(1< for(int i=0;i {
bag[i].clear();
scanf("%d",hav+i);
for(int j=0;j {
int a;
scanf("%d",&a);
bag[i].push_back(a);
}
}
for(int i=1;i memset(vis,false,sizeof(vis));
printf("%d\n",2*dfs(n-1,sum[n-1])-sum[n-1]);
}
return 0;
}



HDOJ 4778 Gems Fight!,布布扣,bubuko.com


推荐阅读
author-avatar
天和网-嫣然
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有