dfs+dp新思路出现TLE
查看原帖
dfs+dp新思路出现TLE
792154
HUSTLJR楼主2024/11/25 13:47

我有个思路,希望通过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;
}


2024/11/25 13:47
加载中...