您的位置:首页 > 其它

hdu-4778-Gems Fight!---状态压缩dp

2014-02-11 00:10 453 查看
/article/2500923.html

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: