炮兵阵地[状态压缩DP]
Posted coder-cjh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了炮兵阵地[状态压缩DP]相关的知识,希望对你有一定的参考价值。
看到这一道题其实和玉米田很类似,只不过多记录了前两行,其他大体细节差不多,注意滚动数组似乎不滚动更快???
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]的主要内容,如果未能解决你的问题,请参考以下文章