hdu-4778-Gems Fight!---状态压缩dp
2014-02-11 00:10
453 查看
/article/2500923.html
http://blog.csdn.net/catalyst1314/article/details/19012251
链接里看的思路,然后写了一下午,晚上改了2个BUG....
http://blog.csdn.net/catalyst1314/article/details/19012251
链接里看的思路,然后写了一下午,晚上改了2个BUG....
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define inf 0x3f3f3f3f int map[22][10],c[10]; int cnt[1<<22][10]; int dp[1<<22]; int lef[1<<22]; int main() { int g,b,s,n; while(cin>>g>>b>>s) { if(!g&&!b&&!s) break; int i,j,k; memset(c,0,sizeof(c)); memset(map,0,sizeof(map)); for(i=0;i<b;i++) { cin>>n; while(n--) { cin>>k; k--; map[i][k]++; c[k]++; } } int sum=0; for(i=0;i<g;i++) sum+=c[i]/s; int tot=(1<<b); memset(cnt,0,sizeof(cnt)); memset(lef,0,sizeof(lef)); for(i=0;i<tot;i++) { for(j=0;j<b;j++) { if(!((i>>j)&1)) { for(k=0;k<g;k++) cnt[i][k]+=map[j][k]; } } for(j=0;j<g;j++){ lef[i]+=cnt[i][j]/s; cnt[i][j]%=s; } lef[i]=sum-lef[i]; } memset(dp,0,sizeof(dp)); for(i=0;i<tot;i++) { for(j=0;j<b;j++) { if((i>>j)&1) { int he=0,l=i-(1<<j); for(k=0;k<g;k++) { he+=(cnt[i][k]+map[j][k])/s; } if(he) { dp[i]=max(dp[i],dp[l]+he); } else { dp[i]=max(dp[i],lef[i]-dp[l]); } } } } cout<<2*dp[tot-1]-sum<<endl; } }
相关文章推荐
- 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
- Android利用广播进行IP拨号
- 自己用C++实现BaseLine Jpeg解码(要点总结)
- 为来往支招(Aaren)
- hdoj1018--Big Number
- 在 Linux 中如何移动文件
- python使用递归解决全排列数字示例
- python基础教程之实现石头剪刀布游戏示例
- python网络爬虫采集联想词示例
- python重试装饰器示例
- python中的yield使用方法
- Python的print用法示例
- 在.net中用CheckBoxList实现单选
- ASP.NET―001:GridView绑定List、页面返回值具体实现
- Ajax实现异步刷新验证用户名是否已存在的具体方法
- ASP.NET汉字转拼音 - 输入汉字获取其拼音的具体实现
- .Net消息队列的使用方法
- php创建sprite
- codeigniter教程之多文件上传使用示例
- php发送post请求的三种方法