码迷,mamicode.com
首页 > 其他好文 > 详细

炮兵阵地[状态压缩DP]

时间:2019-08-24 22:28:53      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:std   continue   nbsp   gets   pre   state   记录   size   include   

看到这一道题其实和玉米田很类似,只不过多记录了前两行,其他大体细节差不多,注意滚动数组似乎不滚动更快???


Code

#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct state{
    int num[105],a[105];
}st[105];
int n,m;
char s[15];
int f[3][105][105];
void getstate(int k,char *s){
    int t=0;
    for(int i=1;i<=m;i++){
        t<<=1;
        if(s[i]==H)
         t++;
    }
    for(int i=0;i<(1<<m);i++){
        if((i&(i<<1))||(i&(i>>1))||(i&(i<<2))||(i&(i>>2))||(i&t))
         continue;
        st[k].a[++st[k].a[0]]=i;
        for(int j=1;j<=(1<<m);j<<=1)
         if(i&j)++st[k].num[st[k].a[0]];
    }
}
inline void dp(){
    memset(f,-0x3f,sizeof(f));
    f[0][0][0]=0;
    for(int j=1;j<=st[1].a[0];j++)
     f[1][j][0]=st[1].num[j];
    for(int i=1;i<=st[2].a[0];i++)
     for(int j=1;j<=st[1].a[0];j++)
      if(!(st[2].a[i]&st[1].a[j]))
       f[2][i][j]=max(f[2][i][j],f[1][j][0]+st[2].num[i]);
    for(int i=3;i<=n;i++)
     for(int j=1;j<=st[i].a[0];j++)
      for(int k=1;k<=st[i-1].a[0];k++)
       if(!(st[i].a[j]&st[i-1].a[k])){
            for(int l=1;l<=st[i-2].a[0];l++)
          if(!(st[i].a[j]&st[i-2].a[l])) 
           f[i%3][j][k]=max(f[i%3][j][k],f[(i-1)%3][k][l]+st[i].num[j]);
       }
    int ans=-0x3f;
    for(int i=1;i<=st[n].a[0];i++)
     for(int j=1;j<=st[n-1].a[0];j++)
      if(!(st[n].a[i]&st[n-1].a[j]))
      ans=max(ans,f[n%3][i][j]);
    cout<<ans<<endl;
}
int main(){
    scanf("%d %d ",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s", s+1);
        getstate(i,s);
    }
    dp();
    return 0;
}

 

炮兵阵地[状态压缩DP]

标签:std   continue   nbsp   gets   pre   state   记录   size   include   

原文地址:https://www.cnblogs.com/coder-cjh/p/11406233.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!