【POJ】1038 Bugs Integrated, Inc.

系统 1453 0
      
          1
      
       #include<cstdio>


      
          2
      
       #include<cstring>


      
          3
      
       #include<vector>


      
          4
      
       #include<algorithm>


      
          5
      
      
        #define
      
       MAXN 160


      
          6
      
      
        #define
      
       MAXM 20


      
          7
      
      
        #define
      
       MAXL 280


      
          8
      
      
        using
      
      
        namespace
      
      
         std;


      
      
          9
      
      
        int
      
      
         n,m;


      
      
         10
      
      
        bool
      
      
         land[MAXN][MAXM];


      
      
         11
      
      
        int
      
      
         put[MAXL][MAXM],cnt[MAXL],tmp[MAXM],size;


      
      
         12
      
       vector<
      
        int
      
      >
      
        G[MAXL];


      
      
         13
      
      
        int
      
       dp[
      
        2
      
      
        ][MAXL][MAXL];


      
      
         14
      
      
        bool
      
      
         OK()


      
      
         15
      
      
        {


      
      
         16
      
      
        int
      
      
         i,j,k,res;


      
      
         17
      
      
        for
      
      (i=res=
      
        0
      
      ;i<m;i++
      
        )


      
      
         18
      
      
            {


      
      
         19
      
      
        if
      
      
        (tmp[i])


      
      
         20
      
      
                {


      
      
         21
      
      
        for
      
      (j=i;j<m&&tmp[i]==tmp[j];j++
      
        );


      
      
         22
      
                   k=j-
      
        i;


      
      
         23
      
      
        if
      
      (tmp[i]==
      
        1
      
      
        )


      
      
         24
      
      
                    {


      
      
         25
      
      
        if
      
      (k%
      
        3
      
      
        )


      
      
         26
      
      
        return
      
      
        false
      
      
        ;


      
      
         27
      
                       res+=k/
      
        3
      
      
        ;


      
      
         28
      
      
                    }


      
      
         29
      
      
        else
      
      
         30
      
      
                    {


      
      
         31
      
      
        if
      
      (k&
      
        1
      
      
        )


      
      
         32
      
      
        return
      
      
        false
      
      
        ;


      
      
         33
      
                       res+=k>>
      
        1
      
      
        ;


      
      
         34
      
      
                    }


      
      
         35
      
                   i=j-
      
        1
      
      
        ;


      
      
         36
      
      
                }


      
      
         37
      
      
            }


      
      
         38
      
           cnt[size]=
      
        res;


      
      
         39
      
      
        return
      
      
        true
      
      
        ;


      
      
         40
      
      
        }


      
      
         41
      
      
        void
      
       DFS(
      
        int
      
      
         now)


      
      
         42
      
      
        {


      
      
         43
      
      
        if
      
      (now==
      
        m)


      
      
         44
      
      
            {


      
      
         45
      
      
        if
      
      
        (OK())


      
      
         46
      
                   memcpy(put[size++],tmp,
      
        sizeof
      
      
        (tmp));


      
      
         47
      
      
            }


      
      
         48
      
      
        else
      
      
         49
      
      
            {


      
      
         50
      
      
        int
      
      
         i;


      
      
         51
      
      
        for
      
      (i=
      
        0
      
      ;i<
      
        3
      
      ;i++
      
        )


      
      
         52
      
      
                {


      
      
         53
      
                   tmp[now]=
      
        i;


      
      
         54
      
                   DFS(now+
      
        1
      
      
        );


      
      
         55
      
      
                }


      
      
         56
      
      
            }


      
      
         57
      
      
        }


      
      
         58
      
      
        bool
      
       Upper(
      
        int
      
       x,
      
        int
      
      
         y)


      
      
         59
      
      
        {


      
      
         60
      
      
        int
      
      
         i;


      
      
         61
      
      
        for
      
      (i=
      
        0
      
      ;i<m;i++
      
        )


      
      
         62
      
      
            {


      
      
         63
      
      
        if
      
      (put[x][i]&&
      
        put[y][i])


      
      
         64
      
      
        return
      
      
        false
      
      
        ;


      
      
         65
      
      
            }


      
      
         66
      
      
        return
      
      
        true
      
      
        ;


      
      
         67
      
      
        }


      
      
         68
      
      
        void
      
      
         Init()


      
      
         69
      
      
        {


      
      
         70
      
      
        int
      
      
         i,j;


      
      
         71
      
           size=
      
        0
      
      
        ;


      
      
         72
      
           memset(land,
      
        false
      
      ,
      
        sizeof
      
      
        (land));


      
      
         73
      
           memset(dp,
      
        0
      
      ,
      
        sizeof
      
      
        (dp));


      
      
         74
      
           DFS(
      
        0
      
      
        );


      
      
         75
      
      
        for
      
      (i=
      
        0
      
      ;i<size;i++
      
        )


      
      
         76
      
      
            {


      
      
         77
      
      
                G[i].clear();


      
      
         78
      
      
        for
      
      (j=
      
        0
      
      ;j<size;j++
      
        )


      
      
         79
      
      
                {


      
      
         80
      
      
        if
      
      
        (Upper(i,j))


      
      
         81
      
      
                        G[i].push_back(j);


      
      
         82
      
      
                }


      
      
         83
      
      
            }


      
      
         84
      
      
        }


      
      
         85
      
      
        bool
      
       Unfit(
      
        int
      
       r,
      
        int
      
      
         x)


      
      
         86
      
      
        {


      
      
         87
      
      
        int
      
      
         i;


      
      
         88
      
      
        for
      
      (i=
      
        0
      
      ;i<m;i++
      
        )


      
      
         89
      
      
            {


      
      
         90
      
      
        if
      
      (land[r][i]&&
      
        put[x][i])


      
      
         91
      
      
        return
      
      
        true
      
      
        ;


      
      
         92
      
      
            }


      
      
         93
      
      
        return
      
      
        false
      
      
        ;


      
      
         94
      
      
        }


      
      
         95
      
      
        bool
      
       First(
      
        int
      
      
         x)


      
      
         96
      
      
        {


      
      
         97
      
      
        int
      
      
         i;


      
      
         98
      
      
        for
      
      (i=
      
        0
      
      ;i<m;i++
      
        )


      
      
         99
      
      
            {


      
      
        100
      
      
        if
      
      (put[x][i]==
      
        2
      
      ||put[x][i]&&land[
      
        1
      
      
        ][i])


      
      
        101
      
      
        return
      
      
        true
      
      
        ;


      
      
        102
      
      
            }


      
      
        103
      
      
        return
      
      
        false
      
      
        ;


      
      
        104
      
      
        }


      
      
        105
      
      
        bool
      
       Three(
      
        int
      
       x,
      
        int
      
       y,
      
        int
      
      
         k)


      
      
        106
      
      
        {


      
      
        107
      
      
        int
      
      
         i;


      
      
        108
      
      
        for
      
      (i=
      
        0
      
      ;i<m;i++
      
        )


      
      
        109
      
      
            {


      
      
        110
      
      
        if
      
      (put[x][i]==
      
        2
      
      
        )


      
      
        111
      
      
                {


      
      
        112
      
      
        if
      
      (put[y][i]||
      
        land[k][i])


      
      
        113
      
      
        return
      
      
        true
      
      
        ;


      
      
        114
      
      
                }


      
      
        115
      
      
            }


      
      
        116
      
      
        return
      
      
        false
      
      
        ;


      
      
        117
      
      
        }


      
      
        118
      
      
        void
      
      
         DoIt()


      
      
        119
      
      
        {


      
      
        120
      
      
        int
      
      
         i,j,k,t,x,y,ans;


      
      
        121
      
      
        for
      
      (ans=i=
      
        0
      
      ;i<size;i++
      
        )


      
      
        122
      
      
            {


      
      
        123
      
      
        if
      
      (Unfit(
      
        2
      
      ,i)||
      
        First(i))


      
      
        124
      
      
        continue
      
      
        ;


      
      
        125
      
               dp[
      
        0
      
      ][i][
      
        0
      
      ]=
      
        cnt[i];


      
      
        126
      
      
            }


      
      
        127
      
      
        for
      
      (i=
      
        3
      
      ;i<=n;i++
      
        )


      
      
        128
      
      
            {


      
      
        129
      
      
        for
      
      (j=
      
        0
      
      ;j<size;j++
      
        )


      
      
        130
      
      
                {


      
      
        131
      
      
        if
      
      
        (Unfit(i,j))


      
      
        132
      
      
        continue
      
      
        ;


      
      
        133
      
      
        for
      
      (k=
      
        0
      
      ;k<G[j].size();k++
      
        )


      
      
        134
      
      
                    {


      
      
        135
      
                       x=
      
        G[j][k];


      
      
        136
      
      
        if
      
      (Unfit(i-
      
        1
      
      ,x)||Unfit(i-
      
        1
      
      
        ,j))


      
      
        137
      
      
        continue
      
      
        ;


      
      
        138
      
      
        for
      
      (t=
      
        0
      
      ;t<G[x].size();t++
      
        )


      
      
        139
      
      
                        {


      
      
        140
      
                           y=
      
        G[x][t];


      
      
        141
      
      
        if
      
      (Unfit(i-
      
        2
      
      ,y)||Unfit(i-
      
        2
      
      ,x)||Three(j,y,i-
      
        2
      
      
        ))


      
      
        142
      
      
        continue
      
      
        ;


      
      
        143
      
                           dp[i&
      
        1
      
      ][j][x]=max(dp[i&
      
        1
      
      ][j][x],dp[(i-
      
        1
      
      )&
      
        1
      
      ][x][y]+
      
        cnt[j]);


      
      
        144
      
      
                        }


      
      
        145
      
                       ans=max(ans,dp[i&
      
        1
      
      
        ][j][x]);


      
      
        146
      
      
                    }


      
      
        147
      
      
                }


      
      
        148
      
      
            }


      
      
        149
      
           printf(
      
        "
      
      
        %d\n
      
      
        "
      
      
        ,ans);


      
      
        150
      
      
        }


      
      
        151
      
      
        int
      
      
         main()


      
      
        152
      
      
        {


      
      
        153
      
      
        int
      
      
         c,q,x,y;


      
      
        154
      
           scanf(
      
        "
      
      
        %d
      
      
        "
      
      ,&
      
        c);


      
      
        155
      
      
        while
      
      (c--
      
        )


      
      
        156
      
      
            {


      
      
        157
      
               scanf(
      
        "
      
      
        %d%d%d
      
      
        "
      
      ,&n,&m,&
      
        q);


      
      
        158
      
      
                Init();


      
      
        159
      
      
        while
      
      (q--
      
        )


      
      
        160
      
      
                {


      
      
        161
      
                   scanf(
      
        "
      
      
        %d%d
      
      
        "
      
      ,&x,&
      
        y);


      
      
        162
      
                   land[x][y-
      
        1
      
      ]=
      
        true
      
      
        ;


      
      
        163
      
      
                }


      
      
        164
      
      
                DoIt();


      
      
        165
      
      
            }


      
      
        166
      
      
        return
      
      
        0
      
      
        ;


      
      
        167
      
       }
    

【POJ】1038 Bugs Integrated, Inc.


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论