记忆搜索
在一些图形问题中,我们会重复用到同一个点的值,我们不需要每次都去递归出这个值是多少,我们用一个数组将这个值保存下来,实现记忆
P1434
这个题直接用dfs会有一组数组TLE,一定要用记忆搜索
#include <bits/stdc++.h>
using namespace std;
int a[105][105];//高度地图
int maxx=0;//输出的最大值
int lenth[105][105];//记录每一个点开始滑行的最远距离
int fxx[5]={0,0,0,1,-1};//方向数组
int fxy[5]={0,1,-1,0,0};//方向数组
int n,m;
int dfs(int nowi,int nowj);//深搜加记忆,返回一个int,指这个点开始滑行的最远距离
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
lenth[i][j]=dfs(i,j);//每一个点查看从此点开始的最远距离
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
maxx=maxx>lenth[i][j]?maxx:lenth[i][j];//遍历寻最大值
}
}
printf("%d\n",maxx);//输出结果
return 0;
}
int dfs(int nowi,int nowj)
{
if(lenth[nowi][nowj])//若之前已经计算过此点,就直接返回值
return lenth[nowi][nowj];
lenth[nowi][nowj]=1;//赋予这个点初始值,也就是最短滑行距离
for(int i=1;i<=4;i++)//每个方向进行测试
{
if(nowi+fxx[i]>=1&&nowi+fxx[i]<=n&&nowj+fxy[i]>=1&&nowj+fxy[i]<=m&&a[nowi+fxx[i]][nowj+fxy[i]]<a[nowi][nowj])
{
lenth[nowi][nowj]=max(lenth[nowi][nowj],dfs(nowi+fxx[i],nowj+fxy[i])+1);
}
}
return lenth[nowi][nowj];//返回它的值,在max中要运用
}