朴素的DFS+贪心区间覆盖
学到了~
#include <bits/stdc++.h>
using namespace std;
#define FORP(i,a,b) for(int i=a;i<=b;++i)
#define pb push_back
#define mp(a,b) make_pair(a,b)
#define db(a) (cout<<"->"<<a<<endl)
#define INF 0x3f3f3f3f
typedef pair<int,int> Pair;
int a[510][510];
int vis[510][510];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int n,m;
int Max,Min;
void dfs(int x,int y){
vis[x][y]=1;
FORP(i,0,3){
int nx=dx[i]+x;
int ny=dy[i]+y;
if(!vis[nx][ny]&&a[nx][ny]<a[x][y]){
vis[nx][ny]=1;
dfs(nx,ny);
}
}
}
void DFS(int x,int y){
if(x==n){
Max=max(Max,y);
Min=min(Min,y);
}
FORP(i,0,3){
int nx=dx[i]+x;
int ny=dy[i]+y;
if(!vis[nx][ny]&&a[nx][ny]<a[x][y]){
vis[nx][ny]=1;
DFS(nx,ny);
vis[nx][ny]=0;
}
}
}
bool cmp(Pair a,Pair b){
return a.first!=b.first?a.first<b.first:a.second<b.second;
}
int main()
{
cin>>n>>m;
memset(a,0x3f,sizeof(a));
FORP(i,1,n){
FORP(j,1,m){
cin>>a[i][j];
}
}
FORP(i,1,m){
dfs(1,i);
}
int cnt=0;
FORP(i,1,m){
if(!vis[n][i]){
cnt++;
}
}
if(cnt==0){
printf("1\n");
vector<Pair> v;
memset(vis,0,sizeof(vis));
FORP(i,1,m){
Max=-INF;
Min=INF;
vis[1][i]=1;
DFS(1,i);
vis[1][i]=0;
if(Max!=-INF&&Min!=INF){
v.pb(mp(Min,Max));
}
}
sort(v.begin(),v.end(),cmp);
int ans=0;
int now=1;
int temp=0;
int index=0;
//mark
while(now<=m){
temp=0;
while(v[index].first<=now){
temp=max(v[index].second,temp);
++index;
}
now=temp+1;
ans++;
}
cout<<ans<<endl;
}
else{
printf("0\n%d\n",cnt);
}
return 0;
}