「国庆训练」 Land of Farms(HDU-5556)

Posted samhx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「国庆训练」 Land of Farms(HDU-5556)相关的知识,希望对你有一定的参考价值。

题意

分析

代码

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <map>
#define MP make_pair
#define PB emplace_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (repType i = (a); i <= (b); ++i)
#define per(i, a, b) for (repType i = (a); i >= (b); --i)
#define QUICKIO                      ios::sync_with_stdio(false);     cin.tie(0);                      cout.tie(0);
using namespace std;
using ll=long long;
using repType=int;

const int MAXN=105;
int mat[12][12];
vector<int> vec;
map<int, int> idx;
int n,m;
bool graph[MAXN][MAXN];
int dp[MAXN];
int mx;
int stk[MAXN][MAXN];

void
init()
{
    ZERO(mat);
    memset(graph,true,sizeof(graph));
    vec.clear();
    idx.clear();
}

const int dx[]={1,0,-1,0},
          dy[]={0,1,0,-1};

int query(int x)
{
    if(idx.find(x)==idx.end()) 
    {
        vec.PB(x);
        return idx[x]=int(vec.size())-1;
    }
    else return idx[x];
}

void dfs(int N,int num,int step)
{
    if(num==0)
    {
        if(step>mx)
        {
            mx=step;
        }
        return;
    }
    for(int i=0;i<num;i++)
    {
        int k = stk[step][i];
        if(step+N-k<=mx) return ;
        if(step+dp[k]<=mx) return ;
        int cnt = 0;
        for(int j=i+1;j<num;j++)
            if(graph[k][stk[step][j]])
            {
                 stk[step+1][cnt++]=stk[step][j];
            }
        dfs(N,cnt,step+1);
    }
}

void run(int N)
{
    mx=0;
    for(int i=N-1;i>=0;i--)
    {
        int sz=0;
        for(int j=i+1;j<N;j++)
            if(graph[i][j]) stk[1][sz++]=j;
        dfs(N,sz,1);
        dp[i]=mx;
    }
}

int
main()
{
QUICKIO
    int T; cin>>T;
    rep(kase,1,T)
    {
        init();
        cin>>n>>m;
        int blank_area=0;
        rep(i,1,n) rep(j,1,m)
        {
            char chr;
            cin>>chr;
            if(chr==‘.‘) mat[i][j]=10+(blank_area++);
            else 
            {
                mat[i][j]=chr-‘0‘;
                /*
                if(ma.find(mat[i][j])==ma.end())
                {
                    vec.PB(mat[i][j]);
                    ma[mat[i][j]]=int(vec.size())-1;
                }
                */
            }
        }
        rep(i,1,n) rep(j,1,m)
        {
            int gx=query(mat[i][j]);
            rep(k,0,3)
            {
                int ti=i+dx[k],
                    tj=j+dy[k];
                if(ti>=1 && ti<=n && tj>=1 && tj<=m)
                {
                    int gy=query(mat[ti][tj]);
                    if(gx!=gy)
                        graph[gx][gy]=graph[gy][gx]=false;
                }
            }
        }
        int gsz=vec.size();
        run(gsz);
        cout<<"Case #"<<kase<<": "<<dp[0]<<endl;
    }
    return 0;
}

以上是关于「国庆训练」 Land of Farms(HDU-5556)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 5556 Land of Farms 最大团+暴力

HDU5556 Land of Farms(二分图 2015 合肥区域赛)

「日常训练」Uncle Tom's Inherited Land*(HDU-1507)

「国庆训练」Bomb(HDU-5934)

hdu 5381 The sum of gcd 2015多校联合训练赛#8莫队算法

hdu 5050 Divided Land