我第一次见AClayton的滑雪代码的时候是2011年 我当时很迷茫,不知道什么是动态规划,不知道什么是搜索,时隔2年,已然很明白了,或许是自己真的走入了IT行业,所学所感,已然到了领悟的时候了,此时再写这个记忆化搜索,心情还是那样的兴奋,大概是对这个行业的热情所致,这个问题很经典,很好,我喜欢这样的题目,因为她不华丽的虚伪,她实在,如果想不通,那么也就写不出,当我用java走上IT征程的这一刻,我决定写下这个代码。
这就是记忆化搜索 搜索+动态规划
其实它的主要思想还是在于第一层的搜索,如果能简单的实现搜索,再加上最大连续字段和的思想(基础动态规划),那么这个问题的本质就被抓出来了,所谓的记忆是为下一次的搜索服务,记忆的方法,就是动态规划
public void dfs(int x,int y){
for(int i=0;i<4;i++)
{
int tx=x+stepx[i];
int ty=y+stepy[i];
if(isInMap(tx,ty))
{
if(iscan(x,y,tx,ty))
{
if(mapping[x][y]+1>mapping[tx][ty])
{
mapping[tx][ty]=mapping[x][y]+1;
//其实如果是单单一次搜索,显然根本就用不上这一段dp方法,
// 这一段dp实际上是为后面的搜索做备份,当然这样也很合适,因为
//这段dp记录的信息很有用
//简单的搜一点出发,搜一条最长路径,那样实在是用不到dp的
//再次验证的dp的实质,记忆化搜索
dfs(tx,ty);
}
}
}
}
}
public static void main(String []args)
{
Sking s=new Sking();
int max=0;
s.createArray();
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
s.dfs(i,j);
}
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(max<s.mapping[i][j])
max=s.mapping[i][j];
System.out.print(s.mapping[i][j]+" ");
}
System.out.println();
}
System.out.println(max+1);
}