此题通过枚举每一个坐标的最长路径,从而找出最长路径。在找坐标map[x][y]的最长路径是通过递归找出map[x-1][y](上),map[x+1][y](下),map[x][y-1](左),map[x][y+1](右)各自的最长路径;将MAX(map[x-1][y],map[x+1][y],map[x][y-1],map[x][y+1])+1即等于map[x][y]的最长路径。在对不同坐标递归时会多次访问到同一个map[i][j],做了大量重复操作,若用一个数组temp[][]保存访问到的map[i][j]的最长路径值,在下次访问到map[i][j]是直接返回temp[i][j]值,就大大提高效率【这就是动态规划】。
#define HEIGHT 100
const int g_nX = {-1,0,1,0};
const int g_nY={0,1,0,-1};
int g_nR;
int g_nC;
int g_nGridHeight[HEIGHT][HEIGHT];
int g_nGridPathLength[HEIGHT][HEIGHT];
// 检测越界
bool OutOfRange(int i, int j)
{
if((i < 0)||(i >= g_nR))
{
return false;
}
else if((j<0)||(j>=g_nC))
{
return false;
}
return true;
}
// 计算一个点的最长路线,使用函数堆栈进行深度搜素
int dp(int i, int j)
{
// 存在既返回,0代表无
if(g_nGridPathLength[i][j] > 0)
{
return g_nGridPathLength[i][j];
}
// 在四个方向上循环深度探索
for(int nDirection = 0; nDirection < 4; nDirection++)
{
// 检测越界
if(OutOfRange(i+g_nX[nDirection], j+g_nY[nDirection]))
{
// 判断临点是否高度低于本点。如果低于,可以将此点加入搜索路径
if(g_nGridHeight[i][j] > g_nGridHeight[i+g_nX[nDirection]][j+g_nY[nDirection]])
{
// 计算临点的dp值,使用了递归。
if(g_nGridPathLength[i][j] < dp(i+g_nX[nDirection], j+g_nY[nDirection]) + 1)
{
g_nGridPathLength[i][j] = p(i+g_nX[nDirection], j+g_nY[nDirection]) + 1;
}
}
}
}
return g_nGridPathLength[i][j];
}
int main()
{
int max =0;
intput(nR, nC);//输入g_nHeight数据,输入滑雪场的长宽
init();//初始化g_nGridPathLength全0
for(int nX=0;nX<nR; nX++)
{
for(int nY=0;nY<nC;nY++)
{
if(max < dp(nX,nY))
{
max = dp(nX,nY);
}
}
}
return 0;
}