hdu4778 Gems Fight!

来源:互联网 发布:java策略模式实例 编辑:程序博客网 时间:2024/06/03 16:31

博弈+状态压缩。感觉其实更像是模拟整个操作过程,每一步都保证达到最优。
然后进行状态转移就好啦。
需要注意的是 数组开小了真的是什么错误都会报,T RE WA都可能出现。。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int g,b,s;int dp[1<<21];int num[30][30];int has[10],now[10];int main(){    while(scanf("%d%d%d",&g,&b,&s)!=EOF)    {        if(g==0&&b==0&&s==0)            break;memset(num,0,sizeof num);        for(int i=0;i<b;i++)        {            int n;            scanf("%d",&n);            for(int j=0;j<n;j++)            {                int x;                scanf("%d",&x);                x--;                num[i][x]++;            }        }        dp[0]=0;        for(int i=1;i<(1<<b);i++)        {            int ff=0;            dp[i]=-1e9;            memset(has,0,sizeof has);            for(int j=0;j<b;j++)            {                if((i&(1<<j))==0)                {                    for(int k=0;k<g;k++)                    {                        has[k]+=num[j][k];                        while(has[k]>=s)                            {                                has[k]-=s;                            }                    }                }            }            for(int j=0;j<b;j++)            {                 int ff=0;                if(i&(1<<j))                {                    for(int k=0;k<g;k++)                    {                        now[k]=has[k];                    }                    for(int k=0;k<g;k++)                    {                        now[k]+=num[j][k];                        while(now[k]>=s)                        {                            now[k]-=s;                            ff++;                        }                    }                    if(ff>0)                        dp[i]=max(dp[i],ff+dp[i^(1<<j)]);                    else                        dp[i]=max(dp[i],-dp[i^(1<<j)]);                }            }        }printf("%d\n",dp[(1<<b)-1]);    }    return 0;}
0 0
原创粉丝点击