题目:https://leetcode-cn.com/problems/frog-jump/
思路:深搜 (注意超时)
用数组dp[][]记录一些情况,避免重复计算。比如dp[i][j]表示前一块石头是i,下一块石头是j,这种情况是不是已经计算过了,如果计算过了就不往下计算。
class Solution {
boolean flag = false; //记录是否可行,一旦得到一种可行的情况,flag = true;
int [] stones ;
int len ;
boolean dp[][]; //dp[i][j] 表示前一步是i,跳到j,是否已经计算过结果
int check(int i,int j,int step)
{
if(stones[i] + step == stones[j]) return 0;
if(stones[i] + step - 1 == stones[j]) return -1;
if(stones[i] + step + 1 == stones[j]) return 1;
return -2;
}
void dfs(int pre,int now,int step)//深搜,上一个石头是pre,现在的石头是now,跨度 step
{
if(dp[pre][now]) {//之前计算过了,不往下遍历
return;
}
dp[pre][now] = true; //标记
if(now==len-1){ //成功,直接返回
flag = true;
return;
}
for(int j=now+1;j<len;j++) //遍历下一块石头
{
int tmp = check(now,j,step); //检查两个石头之间的间隔是否符合题意要求
if(tmp!=-2)
{
dfs(now,j,step+tmp);//跳向下一个石头
if(flag) {
return;
}
}
}
}
public boolean canCross(int[] stones) {
this.stones = stones;
this.len = stones.length;
if(stones[1]!=1) return false;//第二个石头不是1,直接返回
this.dp = new boolean [len+1][len+1]; //开始深搜
dfs(0,1,1);
return flag;
}
}//84.27% 29.41%