poj_1185状压dp

用二维数组写了好久,失败啊。。
#include<iostream>
#include<string.h>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int dp[110][110][110];
char st[110][12];
int s[110],an[110],as[110];
int convert(int n)
{
    int cnt=0;
    while(n>0)
    {
        if(n%2)cnt++;
        n/=2;
    }
    return cnt;
}
int main()
{
    int cnt=0;
    memset(s,0,sizeof(s));
    for(int i=0;i<=(1<<10);i++)
    {
        if(!(i&(i<<1)))
            if(!(i&(i<<2)))
            {as[cnt]=i;s[cnt]=convert(i);cnt++;}

    }
    while(cin>>n>>m)
    {
        int nallstatus=2<<(m-1);
        memset(dp,-1,sizeof(dp));
        memset(st,'\0',sizeof(st));
        memset(an,0,sizeof(an));
        for(int i=0; i<n; i++)
            scanf("%s",st[i]);
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                if(st[i][j]=='H')
                an[i]|=(1<<j);
        for(int j=0; as[j]<nallstatus; j++)
        {
            if(!(as[j]&an[0]))
                {dp[0][0][j]=s[j];
                }
        }
       for(int i=1;i<n;i++)
        for(int j=0;as[j]<nallstatus;j++)
        for(int k=0;as[k]<nallstatus;k++)
        for(int l=0;as[l]<nallstatus;l++)
       {
           int state=1;
           if(as[j]&an[i]) state=0;
            if(as[j]&as[k]) state=0;
            if(as[j]&as[l]) state=0;
            if(as[k]&as[l]) state=0;
            if(as[k]&an[i-1]) state=0;
            if(as[l]&an[i-2]) state=0;
            if(state)
            {
                dp[i][k][j]=max(dp[i][k][j],dp[i-1][l][k]+s[j]);
                /*if(i==3&&as[j]==4)
                {
                    cout<<s[k]<<s[j]<<dp[i-2][as[l]]<<dp[i][as[j]]<<endl;
                    cout<<as[k]<<as[l]<<endl;
                }*/
            }
       }
       /*for(int i=0;i<n;i++)
       {
           for(int j=0;as[j]<nallstatus;j++)
            cout<<dp[i][as[j]];
           cout<<endl;
       }*/
       /*for(int i=0;as[i]<nallstatus;i++)
        cout<<dp[0][as[i]]<<as[i]<<endl;*/
       int cur=0;
       for(int i=0;as[i]<nallstatus;i++)
        for (int j=0;as[j]<nallstatus;j++)
        cur=max(cur,dp[n-1][i][j]);
       cout<<cur<<endl;
    }
    return 0;
}

posted @ 2014-05-28 21:21  JarvisLau  阅读(112)  评论(0编辑  收藏  举报