1. 程式人生 > >【leetcode最短路】818. Race Car

【leetcode最短路】818. Race Car

ref node turn pla posit str IT step des

https://leetcode.com/problems/race-car/description/

1. BFS剪枝 0<=current position<=2*target。為什麽2*target有點不太明白

技術分享圖片
 1 class Solution {
 2 public:
 3     int dp[10002];
 4     struct Node{
 5         int pos;
 6         int speed;
 7         int step;
 8         Node(int p,int s,int ss){
 9             pos=p;
10 speed=s; 11 step=ss; 12 } 13 }; 14 int racecar(int target) { 15 queue<Node> Q; 16 set<pair<int,int> > vis; 17 Q.push(Node(0,1,0)); 18 vis.insert({0,1}); 19 while(!Q.empty()){ 20 Node q=Q.front();
21 Q.pop(); 22 if(q.pos==target) return q.step; 23 if(vis.find({q.pos+q.speed,q.speed*2})==vis.end()&&q.pos+q.speed>=0&&q.pos+q.speed<=2*target){ 24 vis.insert({q.pos+q.speed,q.speed*2}); 25 Q.push(Node(q.pos+q.speed,q.speed*2
,q.step+1)); 26 } 27 if(vis.find({q.pos,q.speed>0?-1:1})==vis.end()){ 28 vis.insert({q.pos,q.speed>0?-1:1}); 29 Q.push(Node(q.pos,q.speed>0?-1:1,q.step+1)); 30 } 31 } 32 return -1; 33 } 34 };
View Code

2. Dijkstra,官方題解,沒太看懂

3. DP

技術分享圖片
 1 class Solution {
 2 public:
 3     int dp[10002];
 4     int racecar(int target) {
 5         if(dp[target]!=0) return dp[target];
 6         int bound;
 7         for(int i=0;i<32;i++){
 8             if((1<<i)-1==target) return dp[target]=i;
 9             if((1<<i)-1>target){
10                 bound=i;
11                 break;
12             }
13         }
14         dp[target]=bound+1+racecar((1<<bound)-1-target);
15         for(int i=0;i<bound-1;i++){
16             dp[target]=min(dp[target],bound-1+1+i+1+racecar(target-(((1<<(bound-1))-1)-((1<<i)-1))));
17         }
18         return dp[target];
19     }
20 };
View Code

【leetcode最短路】818. Race Car