转自wdd :http://blog.csdn.net/u010535824/article/details/38540835

题目链接:hdu 4778

状压DP

用DP[i]表示从i状态选到结束得到的最大值

代码也来自wdd

 /******************************************************
* File Name: b.cpp
* Author: kojimai
* Creater Time:2014年08月13日 星期三 11时42分53秒
******************************************************/
/*
*有g种颜色的宝石,在一个容器中每s个同色宝石可以合成一个魔法石,给你b个包,里面有一定数目的宝石。
*两人博弈,每个人每个回合把一个包中的所有的宝石放进容器中,如果该操作能得到一个魔法石,则能再进行一次操作
*两个人都采取最有策略,问最终先手得到的魔法石与后手得到的魔法石的差值为多少 *状压DP,dp[i]表示i状态为起始,选到结束能得到的最大值
*i&(1<<j)==0 表示当前状态下j已经选过了
*i&(1<<j)==1 表示当前状态下j可选,转移方程:
**dp[i]=max(dp[i],dp[i^(1<<j)]+cnt) 在i^(1<<j)状态下选j能得到cnt个魔法石
**dp[i]=max(dp[i],-dp[i^(1<<j)]) 选了j之后得不到魔法石
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define FFF -23333333
int gem[][];//每个包中的宝石
int now[];//当前状态每种宝石的数目
int dp[<<];//1表示还剩哪些位可以选,0表示该位已经选了,在该状态下一直选到结束的最大情况
int main()
{
int g,b,s;
while(cin>>g>>b>>s)//g-colornum b-bag s-least
{
if(g+b+s==)
break;
memset(gem,,sizeof(gem));
for(int i=;i<b;i++)
{
int x,y;
scanf("%d",&x);
for(int j=;j<x;j++)//读取每个包中的宝石数
{
scanf("%d",&y);
gem[i][y]++;
}
}
int all=(<<b);
dp[]=;
for(int i=;i<all;i++)
{
dp[i]=FFF;
memset(now,,sizeof(now));
for(int j=;j<b;j++)
{
if((i&(<<j))==)//当前i状态中j不可选,即之前j已经选过了,统计出所有已经选过的点得到的当前剩余的宝石
{
for(int k=;k<=g;k++)
{
now[k]=(now[k]+gem[j][k])%s;
}
}
}
/* cout<<"i="<<i<<":"<<endl;
for(int j=1;j<=g;j++)
cout<<now[j]<<' ';
*/ int cnt=;
for(int j=;j<b;j++)
{
if((i&(<<j))!=)
{
cnt=;
for(int k=;k<=g;k++)
{
int t=now[k]+gem[j][k];
cnt+=t/s;
}
//cout<<"j="<<j<<" cnt="<<cnt<<endl;
if(cnt)
dp[i]=max(dp[i],cnt+dp[i^(<<j)]);
else
dp[i]=max(dp[i],-dp[i^(<<j)]);
}
}
//cout<<"i="<<i<<" dp="<<dp[i]<<endl;
}
cout<<dp[all-]<<endl;
}
return ;
}

hdu 4778 Gems Fight! 状压dp的更多相关文章

  1. hdu 4778 Gems Fight! 博弈+状态dp+搜索

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...

  2. Hdu 4778 Gems Fight! (状态压缩 + DP)

    题目链接: Hdu 4778 Gems Fight! 题目描述: 就是有G种颜色,B个背包,每个背包有n个宝石,颜色分别为c1,c2............两个人轮流取背包放到公共容器里面,容器里面有 ...

  3. hdu 4778 Gems Fight! 状态压缩DP

    Gems Fight! Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others)T ...

  4. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  5. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. HDU 5765 Bonds(状压DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...

  7. hdu 3681(bfs+二分+状压dp判断)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3681 思路:机器人从出发点出发要求走过所有的Y,因为点很少,所以就能想到经典的TSP问题.首先bfs预 ...

  8. hdu 4856 Tunnels (bfs + 状压dp)

    题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...

  9. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

随机推荐

  1. UVA - 1279 Asteroid Rangers (动点的最小生成树)

    题意,有n个匀速动点,求最小生成树的改变次数. 一句话总结:动态问题的一般做法是先求出一个静态的解,然后求出解发生改变的事件,事件按照时间排序,依次处理. 先求出最开始的最小生成树(MST),当MST ...

  2. poj1338 Ugly Numbers 打表, 递推

    题意:一个数的质因子能是2, 3, 5, 那么这个数是丑数. 思路: 打表或者递推. 打表: 若该数为丑数,那么一定能被2 或者3, 或者5 整除, 除完之后则为1. #include <ios ...

  3. urllib基础-利用网站结构爬取网页-百度搜索

    有的时候爬取网页,可以利用网站额结构特点爬取网页 在百度搜索框中输入搜索内容,单击搜索,浏览器会发送一个带有参数的url请求.尝试删除其中的一些参数,只剩下wd这个参数.发现wd是搜索内容.这样程序可 ...

  4. 插入函数概念 接收一个callback,然后外面函数,接一个对象,和一个next,外面都执行完了,继续执行下一个函数,相当于一个链状体,插入了一个函数的概念 | log4js 输出 等于 console.info

    插入函数概念 接收一个callback,然后外面函数,接一个对象,和一个next,外面都执行完了,继续执行下一个函数,相当于一个链状体,插入了一个函数的概念 app.use(function (ctx ...

  5. Asp.Net Core 进阶(一) —— 读取appsettings.json

    我们以前在Asp.Net MVC中使用 System.Configuration.ConfigurationManager 来读取web.config文件.但是Asp.Net Core MVC已经没有 ...

  6. Vue的安装并在WebStorm中运行

    一.Vue的安装需要两个支持分别为:nodejs.npm Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O ...

  7. BOM函数之history对象

    前面的话 history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起.由于安全方面的考虑,开发人员无法得到用户浏览器的URL,但借由用户访问过的页面列表,可以在不知道实际URL的情况下实现后 ...

  8. vue父组件获取子组件页面的数组 以城市三级联动为例

    父组件调用子组件 <Cselect ref="registerAddress"></Cselect> import Cselect from '../../ ...

  9. kill, killall, pkill, xkill

    1. Kill Command – Kill the process by specifying its PID All the below kill conventions will send th ...

  10. JavaScript正则表达式-定义

    通过RegExp()构造函数创建RegExp对象来定义正则表达式. var reg_pattern = new RegExt("a\d"); 通过字面语法直接定义正则表达式. va ...