我们维护青蛙从某个石头上可以跳那些长度的距离即可 用平衡树维护。
总的复杂度O(n^2logn)
class Solution {
public:
bool canCross(vector<int>& stones) {
map<int,int>po;
int n=stones.size();
map<int,int>dis[1500];
for(int i=0;i<stones.size();i++)
po[stones[i]]=i;
dis[0][1]=1;
if(stones[1]!=stones[0]+1)return false;
dis[1][1]=dis[1][2]=1;
for(int i=1;i<stones.size();i++)
{
dis[i-1].clear();
map<int,int>::iterator it;
for(it=dis[i].begin();it!=dis[i].end();it++)
{
if(it->first<=0)continue;
int np=stones[i]+it->first;
if(po.count(np))
{
if(it->first>1)dis[po[np]][it->first-1]=1;
dis[po[np]][it->first]=1;
if(it->first<=n)dis[po[np]][it->first+1]=1;
}
}
}
if(dis[n-1].size()>0)return true;
else return false;
}
};
第十七周 Leetcode 403. Frog Jump(HARD) 线性dp
原文:http://www.cnblogs.com/heisenberg-/p/6978408.html