我有个思路,希望通过dfs+dp解答,但是第二个测试集TLE了,有没有大手帮忙分析一下,个人感觉时间复杂度比二分查找低哇(多数测试集运行比二分快) 代码如下:
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> pii;
queue<pii> q;
queue<pii> flag;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
const int N=505;
int m,n;
int p[N][N];
int dp[N][N];
int ans;
void bfs(pii a)
{
q.push(a);
while(q.size())
{
pii tmp=q.front();
q.pop();
for(int i=0;i<4;i++){
int a=tmp.x+dx[i];
int b=tmp.y+dy[i];
if(a<1||a>m||b<1||b>n) continue; //界限判断
int new_dp = max(dp[tmp.x][tmp.y], abs(p[a][b] - p[tmp.x][tmp.y]));
//状态转移方程 max(相邻节点dp值,和相邻节点高度差)
if (new_dp < dp[a][b])
{
dp[a][b] = new_dp; //更新dp值
q.push({a, b}); //如果更新,重新入队,用于更新其相邻点
}
}
}
}
int main()
{
cin>>m>>n;
ans=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>p[i][j];
}
}
for(int i=0;i<=m+1;i++) //dp数组初始化为最大
{
for(int j=0;j<=n+1;j++)
{
dp[i][j]=1e9;
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
int tmp;
cin>>tmp;
if(tmp==1) //flag存入队列
{
flag.push({i,j});
}
}
}
pii tmp;
tmp=flag.front();
flag.pop();
dp[tmp.x][tmp.y]=0; //自己的距离为0
bfs(tmp);
while(flag.size()) //比较每个flag点的dp值
{
pii tmp=flag.front();
flag.pop();
int a=tmp.x;
int b=tmp.y;
if(dp[a][b]>ans) ans=dp[a][b];//取最大值
}
cout<<ans<<endl;
}