额,刚开始有指导说用动态规划,而我也觉得dp 是可解的,但是后来提交时WA,用了一组测试数据发现存在漏洞 。例如: 3 1 0 0 1 0 0 1 0 0
后来又有人说用搜索,可是自己却感觉搜素不可行的,不过结果是可想而知的。。。。。。
#include<stdio.h>
#include<string.h>
#define SIZE_N 101
#define INF_MAX 0x7fffffff
int Map[SIZE_N][SIZE_N],vis[SIZE_N][SIZE_N];
int n,H,L,flag;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
void DFS(int x,int y)
{
int i,xx,yy;
if(flag)return ;
vis[x][y]=1;
if(Map[x][y]<L||Map[x][y]>H)
return ;
if(x==n&&y==n){
flag=1;
return;
}
for(i=0;i<4;i++){
xx=x+dir[i][0];
yy=y+dir[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&!vis[xx][yy]){
DFS(xx,yy);
}
}
}
int main()
{
int i,j;
int max,min;
int hight,mid,low;
while(scanf("%d",&n)!=EOF){
min=INF_MAX,max=-1;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
scanf("%d",&Map[i][j]);
if(Map[i][j]<min)min=Map[i][j];
if(Map[i][j]>max)max=Map[i][j];
}
}
hight=max-min;low=0;
while(hight>=low){
mid=(hight+low)/2;
for(i=min;i<=max-mid;i++){
H=i+mid;L=i;flag=0;
memset(vis,0,sizeof(vis));
DFS(1,1);
if(flag)break;
}
if(i<=max-mid)hight=mid-1;
else low=mid+1;
}
printf("%d\n",hight+1);
}
return 0;
}
下面是我写的dp 版
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#define MAX 1000
#define MIN 0
#define max(x,y) x>y?x:y
#define min(x,y) x<y?x:y
using namespace std;
int a[102][102];
int mi[102][102], ma[102][102];
int dp(int n)
{
int i, j, k;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
cin>>a[i][j];
for(j=1; j<n; j++)
{
mi[0][j] = min(a[1][j],a[1][j+1]);
ma[0][j] = max(a[1][j],a[1][j+1]);
}
for(i=1; i<n; i++)
{
mi[i][0] = min(a[i][1],a[i+1][1]);
ma[i][0] = max(a[i][1],a[i+1][1]);
}
ma[1][2] = mi[1][2]= ma[2][1] = mi[2][1] = a[1][1];
for(i=2; i<=n; i++)
for(j=2; j<=n; j++)
{
if( (max(ma[i-1][j],a[i][j])- min(mi[i-1][j],a[i][j]) ) < (max(ma[i][j-1],a[i][j])- min(mi[i][j-1],a[i][j])) )
{
mi[i][j]= min(mi[i-1][j],a[i][j]);
ma[i][j]= max(ma[i-1][j],a[i][j]);
}
else
{
mi[i][j]= min(mi[i][j-1],a[i][j]);
ma[i][j]= max(ma[i][j-1],a[i][j]);
}
}
return ma[n][n] - mi[n][n];
}
int main()
{
int n;
int i,j;
while(scanf("%d",&n)!=EOF)
{
int k = dp(n);
printf("%d\n",k);
}
system("pause");
return 0;
}