算法解析:可以利用递归然后记录已计算出最长距离的点(便于后续的调用),其实是利用动态规划思想,最长距离=max(该点到其他可到达点距离+其他可到达点最长距离)。
算法参照了http://poj.org/showmessage?message_id=113914
算法代码注意事项:这次居然一次就通过了,调试时间也很短,其实理解了动态规划思想本身编程不是特别麻烦。
#include<iostream>
//#include <fstream>
using namespace std;
//初始化
int row,col;
int m[100][100];
int l[100][100];
//返回坐标为i,j时的最大距离
int Dfs(int i, int j)
{
if (l[i][j]!=0)
{
return l[i][j];
}
int max=0;
//左边点
if (i>0)
{
if (m[i-1][j]<m[i][j])
{
if (max<Dfs(i-1,j))
{
max=Dfs(i-1,j);
}
}
}
//上边点
if (j>0)
{
if (m[i][j-1]<m[i][j])
{
if (max<Dfs(i,j-1))
{
max=Dfs(i,j-1);
}
}
}
//右边点
if (i<row-1)
{
if (m[i+1][j]<m[i][j])
{
if (max<Dfs(i+1,j))
{
max=Dfs(i+1,j);
}
}
}
//下边点
if (j<col-1)
{
if (m[i][j+1]<m[i][j])
{
if (max<Dfs(i,j+1))
{
max=Dfs(i,j+1);
}
}
}
return l[i][j]=max+1;
}
int main()
{
// ifstream infile("test.txt");
// ofstream outfile("result.txt");
//输入
cin>>row>>col;
// infile>>row>>col;
for (int i=0; i!=row; i++)
{
for (int j=0; j!=col; j++)
{
cin>>m[i][j];
// infile>>m[i][j];
l[i][j]=0;
}
}
//求取矩阵所有点的最大距离
for (int i=0; i!=row; i++)
{
for (int j=0; j!=col; j++)
{
l[i][j]=Dfs(i,j);
}
}
//求取所有点中最大的距离值
int max=0;
for (int i=0; i!=row; i++)
{
for (int j=0; j!=col; j++)
{
if (max<l[i][j])
{
max=l[i][j];
}
}
}
//输出
cout<<max<<endl;
// outfile<<max<<endl;
// infile.close();
// outfile.close();
}
其他:还有一种 不使用递归的动态规划算法,该算法先将高度进行排序,从最低点开始处理,避免了边界问题(因为边界高度为0必然小于最低点,而我们是由从低向高进行处理,因而边界点绝对不符合条件),具体的分析和代码可以参考上面给出的链接。


528

被折叠的 条评论
为什么被折叠?



