码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-10-03 23:23:58      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:quick   query   dfs   cto   names   back   har   void   with   

题意

分析

代码

#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)

标签:quick   query   dfs   cto   names   back   har   void   with   

原文地址:https://www.cnblogs.com/samhx/p/hdu-5556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!