POJ 1185 状压DP

来源:互联网 发布:js跨域请求 编辑:程序博客网 时间:2024/06/14 08:30
#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;int map[101];//int dp[101][(1<<10)];int dp[101][70][70];int st[70];int num[(1<<10)];inline int jcount(int x){   int cnt=0;   while(x)   {       cnt++;       x&=(x-1);   }   return cnt;}int main(){    int t=0;    for(int i=0;i<(1<<10);i++)    {        num[t++]=jcount(i);        //printf("%d\n",num[t-1]);        //system("pause");    }    int n,m;    while(~scanf("%d%d",&n,&m))    {        int ans=0;        memset(map,0,sizeof(map));        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++)        {            char temp[15];            scanf("%s",temp);            int len=strlen(temp);            for(int j=0;j<len;j++)            {                if(temp[j]=='H')                    map[i]+=(1<<j);            }        }//        for(int i=1;i<=n;i++)//        {//            for(int j=1;j<=m;j++)//            {//                if(map[i]&(1<<(j-1)))//                    printf("0");//                else//                    printf("1");//            }//            printf("\n");//        }        int k=0;        for(int i=0;i<(1<<m);i++)        {            if(!(i&(i<<2))&&!(i&(i<<1)))            {                st[k++]=i;            }        }        for(int i=0;i<k;i++)        {            if(map[1]&st[i])                continue;            dp[1][0][i]=num[st[i]];            ans=max(dp[1][0][i],ans);            for(int j=0;j<k;j++)            {                if(map[2]&st[j])                    continue;                if(!(st[i]&st[j]))                    dp[2][i][j]=num[st[i]]+num[st[j]];            }        }        for(int i=3;i<=n;i++)        {            for(int j=0;j<k;j++)            {                if(map[i]&st[j])                    continue;                for(int u=0;u<k;u++)                {                    if(map[i-1]&st[u])                        continue;                    for(int v=0;v<k;v++)                    {                        if(map[i-2]&st[v])                            continue;                        if(st[j]&st[u]||st[j]&st[v]||st[u]&st[v])                            continue;                        dp[i][u][j]=max(dp[i-1][v][u]+num[st[j]],dp[i][u][j]);                    }                }            }        }        if(n==1) {printf("%d\n",ans); continue;}        ans=0;        for(int i=0;i<k;i++)        {            for(int j=0;j<k;j++)            {                ans=max(dp[n][i][j],ans);            }        }        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击