bzoj 1087 题解

来源:互联网 发布:淘宝职业退货师被抓 编辑:程序博客网 时间:2024/05/16 11:03

状态压缩的dp

Code:

/**************************************************************    Problem: 1087    User: wohenshuai    Language: C++    Result: Accepted    Time:120 ms    Memory:19344 kb****************************************************************/ #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define LL unsigned long longusing namespace std;LL bit[1100];LL n,m;void Input(){  scanf("%lld%lld",&n,&m);  for(LL i=1;i<=n+1;i++)    bit[i]=1<<(i-1);}LL ans;LL cnt[1100]; LL len;LL f[1100][1100];LL Count[1100];void Print(){  len=0; memset(cnt,0,sizeof(cnt));  memset(f,0,sizeof(f));  for(LL i=0;i<bit[n+1];i++)  {    bool bk=true;    for(LL j=2;j<n;j++)    {      LL dx,dy,dz;      dx=(i&bit[j-1]);      dy=(i&bit[j]);      dz=(i&bit[j+1]);      if(((dx==bit[j-1])&(dy==bit[j]))||((dy==bit[j])&(dz==bit[j+1])))      {        bk=false; break;      }    }    if(bk==true)    {      cnt[++len]=i;      for(LL j=1;j<=n;j++)        if((i&bit[j])==bit[j])          Count[len]++;    }  }  for(LL i=1;i<=len;i++)  {    for(LL j=1;j<=len;j++)    {      if((!(cnt[i]&cnt[j]))&&(!(cnt[i]&(cnt[j]<<1)))&&(!(cnt[i]&(cnt[j]>>1))))      {        f[i][j]=1;      }    }  }}LL dp[10][100][1100];LL Dp(){  for(LL i=1;i<=len;i++) dp[1][Count[i]][i]+=1;  for(LL i=2;i<=n;i++)  {    for(LL j=1;j<=len;j++)    {      for(LL k=1;k<=len;k++)      {        if(f[j][k])        {          for(LL p=0;p<=m;p++)            dp[i][p+Count[k]][k]+=dp[i-1][p][j];        }      }    }  }  LL ans=0;  for(LL i=1;i<=len;i++)    ans+=dp[n][m][i];  return ans;}void Solve(){  Print();  printf("%lld\n",Dp());}int main(){  Input();  Solve();  return 0;}



0 0
原创粉丝点击