动态规划——Frog Jump

题目大意就是,给定一个数组,数组中数字从小到大排列,第一个元素一定是0,青蛙的初始位置就在0,后面依次从小到大排列,表示第几个石子,青蛙只有跳到最后一个石子上才算成功过河,而且青蛙第一次从0位置只能跳一个单位。假如上一次青蛙跳了k个单位,下一次青蛙只能跳 k - 1 , k , k + 1个单位。
这个题的状态不是一个简单的dp数组,因为状态的提取很难用数组实现,这个题要用set和map这种现成的数据结构,这里不再细讲因为这个题只要会C++中的set和map两种存储结构就能简单的AC,map用来储存 i ->value[i] ,set用来储存每个石子上能跳的单位数量。这个题具有明显的递推关系,所以算动态规划类的题目。
 
 1 bool canCross(vector<int>& stones) {
 2         if(stones[1]!=1)return false;
 3         set<int>pos1[1111];
 4         pos1[0].insert(1);
 5         map<int,int>pos2;
 6         int len = stones.size();
 7         for(int i = 0;i<len;i++)
 8             pos2[stones[i]] = i;
 9         for(int i = 0;i<len;i++){
10             for(set<int>::iterator j = pos1[i].begin();j!=pos1[i].end();j++){
11                int tmp = *j;
12                if(pos2[stones[i]+tmp])pos1[pos2[stones[i]+tmp]].insert(tmp);
13                if(pos2[stones[i]+tmp+1])pos1[pos2[stones[i]+tmp+1]].insert(tmp+1);
14                if(pos2[stones[i]+tmp-1])pos1[pos2[stones[i]+tmp-1]].insert(tmp-1);
15             }
16         }
17         return pos1[len-1].size();
18     }

 

posted @ 2018-11-11 21:31  messi2017  阅读(343)  评论(0编辑  收藏  举报