「国庆训练」 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)的主要内容,如果未能解决你的问题,请参考以下文章
HDU5556 Land of Farms(二分图 2015 合肥区域赛)
「日常训练」Uncle Tom's Inherited Land*(HDU-1507)