• 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,'',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;
    }
    

  • 相关阅读:
    Java 8 对 List<List<String>> 排序
    获取自然月的起始日期和终止日期
    Java 中如何计算两个字符串时间之间的时间差?(单位为分钟)
    Java StringJoiner
    回文数
    Java 中的值传递和引用传递问题
    substring
    集合的四种遍历方式
    Java 中的静态嵌套类和非静态嵌套类
    使用 Java 查找字符串中出现次数最多的字符以及出现的次数?
  • 原文地址:https://www.cnblogs.com/vactor/p/4100007.html
Copyright © 2020-2023  润新知