hdu 4778 Gems Fight!
2024-10-21 15:36:34
第一次写状压dp……
题意:http://blog.csdn.net/dyx404514/article/details/15506601
状压dp+博弈吧……
#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
int dp[2100000];
int bag[21][8];
int g,b,s;
int dfs(int state,int *remain,int all)
{
int t[8];
int i,sum,j;
if(state==0||all==0)
return 0;
if(dp[state]!=-1)
return dp[state];
for(i=0;i<b;i++)
{
if((state>>i)&1)
{
sum=0;
for(j=0;j<g;j++)
{
t[j]=bag[i][j]+remain[j];
sum+=t[j]/s;
t[j]%=s;
}
if(sum)
{
if(dp[state]==-1)
dp[state]=sum+dfs(state^(1<<i),t,all-sum);
else
dp[state]=max(dp[state],sum+dfs(state^(1<<i),t,all-sum));
}
else
{
if(dp[state]==-1)
dp[state]=all-dfs(state^(1<<i),t,all);
else
dp[state]=max(dp[state],all-dfs(state^(1<<i),t,all));
}
}
}
return dp[state];
}
int main()
{
int i,j,t,n,sum;
int remain[8];
while(scanf("%d%d%d",&g,&b,&s)&&g||b||s)
{
memset(bag,0,sizeof(bag));
for(i=0;i<b;i++)
{
scanf("%d",&n);
while(n--)
{
scanf("%d",&t);
bag[i][t-1]++;
}
}
sum=0;
for(i=0;i<g;i++)
{
t=0;
for(j=0;j<b;j++)
t+=bag[j][i];
sum+=t/s;
}
memset(dp,-1,sizeof(dp));
memset(remain,0,sizeof(remain));
printf("%d\n",2*dfs((1<<b)-1,remain,sum)-sum);
}
return 0;
}
最新文章
- jQuery介绍 DOM对象和jQuery对象的转换与区别
- js串讲回顾
- 如何查看eclipse或Myeclipse的版本号
- PHP集成支付宝快速实现充值功能
- CocoaPods使用命令
- PL/SQL 访问网页(get or post方式)
- Java基本类型与包装类
- hdu3415:最大k子段和,单调队列
- ActiveX异步回调JavaScript
- 【转】LINUX下一款不错的网站压力测试工具webbench
- 阅读《大道至简第一章》读后感(java伪代码)
- 『OGG 03』Win7 配置 Oracle GoldenGate 一次性成功(包括Adapter Java)
- EF获取多个数据集以及MySQL分页数据查询优化
- 【记录】Windows 操作系统常用快捷命令
- Beta(1/7)
- 如何学习sss和前端数据处理
- hihoCoder #1457 : 后缀自动机四&#183;重复旋律7(后缀自动机 + 拓扑排序)
- [Vuex] Create a Vuex Store using TypeScript
- 54.超大数据快速导入MySQL
- SQL里执行CLR c#代码