题目:
分析:
困难题,想了想没什么思路。
看到题解提示的dp,没思路。
看到题解提示的搜索,想了一会,有了思路。
可以剪枝,以同一个步数跳到某个石头上之后的状态是多余的。
这里的剪枝,由于数组不好开,因此我开了个map<pair<int,int>,int> mm;不错,很灵活。
代码:
class Solution {
public:
map<pair<int,int>,int> mm;//pair 的第一个元素是石头的下标,第二个元素是第几步过来的。
bool f(vector<int>& stones,int step,int x)
{//以step跳到了stones-x上。
if(x==stones.size()-1)
{
return 1;
}
pair<int,int> p(step,x);
if(mm[p]==1) return 0;
mm[p]++;
int ok=0;
for(int i=x+1;i<stones.size();i++)
{
if(stones[i]>step+1+stones[x]) break;
if(stones[i]==step+1+stones[x])
{
ok=f(stones,step+1,i);
if(ok) return 1;
}
else if(step!=0&&stones[i]==step+stones[x])
{
ok=f(stones,step,i);
if(ok) return 1;
}
else if(step!=0&&step!=1&&stones[i]==step-1+stones[x])
{
ok=f(stones,step-1,i);
if(ok) return 1;
}
}
return ok;
}
bool canCross(vector<int>& stones) {
return f(stones,0,0);
}
};