poj1185炮兵阵地(状态压缩DP)

来源:互联网 发布:js object比较 编辑:程序博客网 时间:2024/06/06 05:09

状态压缩就是利用各种进制(基本是二进制)来保存一个状态,在这种图中应用起来也很方便,这道题我觉得有点烦,看了这位大神的详细讲解之后,才算明白地比较彻底,明白之后觉得这道题只是有一点复杂,思路还是很清晰的


代码在这:

#include <bits/stdc++.h>#define max(a,b) a>b?a:b#define cl(a) memset(a,0,sizeof(a))#define q(a,b) a&busing namespace std;int row,col;int num,x;int base[110];int state[110];int soldier[110];int dp[110][110][110];char g[110][20];int main(){    num=0;    scanf("%d%d",&row,&col);    for(int i=0;i<row;++i)    {        scanf("%s",g[i]);        for(int j=0;j<col;++j)            if(g[i][j]=='H') base[i]+=1<<j;    }    for(int i=0;i<(1<<col);++i)    {        if(q(i,i<<1)||q(1,1<<2)) continue;        x=i;        while(x>0)        {            soldier[num]+=x&1;            x=x>>1;        }        state[num++]=i;    }    for(int i=0;i<num;++i)  //第一行状态初始化    {        if(q(state[i],base[0])) continue;        dp[0][i][0]=soldier[i];    }    for(int i=0;i<num;++i)    {        if(q(state[i],base[1])) continue;  //第二行状态初始化        {            for(int j=0;j<num;++j)            {                if(q(state[j],base[0])) continue;                if(q(state[i],state[j])) continue;                dp[1][i][j]=max(dp[1][i][j],dp[0][j][0]+soldier[i]);            }        }    }    for(int r=2;r<row;++r)    {        for(int i=0;i<num;++i)        {            if(q(state[i],base[r])) continue;            for(int j=0;j<num;++j)            {                if(q(state[j],base[r-1])) continue;                if(q(state[i],state[j])) continue;                for(int k=0;k<num;++k)                {                    if(q(state[k],base[r-2])) continue;                    if(q(state[k],state[j])) continue;                    if(q(state[k],state[i])) continue;                    dp[r][i][j]=max(dp[r][i][j],dp[r-1][j][k]+soldier[i]);                }            }        }    }    int ans=0;    for(int i=0;i<num;++i)        for(int j=0;j<num;++j)            ans=max(ans,dp[row-1][i][j]);    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击