炮兵阵地 POJ

来源:互联网 发布:java传递参数基本类型 编辑:程序博客网 时间:2024/06/15 10:00

https://vjudge.net/contest/177552#problem/V

参考https://vjudge.net/solution/8102820
还是只能看别人的,
他这里预处理。。
所以存的就不是(1<<10)那么大的数了,所以可以保存上一个的状态和这一个的状态。。

自己太粗心了。。弄了挺久都没改出来。。。(以后再改吧。。)

int n,m;vector<int>state[110];int dp[110][N][N];char s[110][15];void solve(){    for(int i=1;i<=n;++i){        for(int j=0;j<state[i].size();++j){            int num=0,t=state[i][j];            while(t){                t&=t-1;num++;            }            if(i==1)dp[i][j][0]=num;            else{                for(int last=0;last<state[i-1].size();++last){                    if(!(state[i][j]&state[i-1][last])){                        if(i==2)dp[i][j][last]=max(dp[i][j][last],num+dp[i-1][last][0]);                        else{                            for(int z=0;z<state[i-2].size();++z)                                if(!(state[i][j]&state[i-2][z]))                                    dp[i][j][last]=max(dp[i][j][last],dp[i-1][last][z]+num);                        }                    }                }            }        }    }}int main(){    while(~sf("%d%d",&n,&m)){        mem(dp,0); int ans=0;        rep(i,1,n){ sf("%s",s[i]); }        int up=(1<<m)-1;        for(int i=1;i<=n;++i){            state[i].clear();            int t=0;            for(int k=0;k<m;++k){                t+=(1<<k)+s[i][k]=='P'?0:1;            }            for(int j=0;j<=up;++j){                if(!(j&(j>>1))&&!(j&(j>>2))&&!(j&(j<<1))&&!(j&(j<<2))&&!(j&t))                state[i].push_back(j);            }        }        solve();        for(int i=0;i<state[n].size();++i){            if(n==1)ans=max(ans,dp[1][i][0]);            else for(int j=0;j<state[n-1].size();++j)                ans=max(ans,dp[n][i][j]);        }        pf("%d\n",ans);    }}