题目出处:https://leetcode-cn.com/problems/minimum-sideway-jumps/
动态规划:
状态定义:dp[i][j]是代表跳到第i个位置的第j个跑道所需要的最小测跳次数
class Solution {
public:
int minSideJumps(vector<int>& obstacles) {
//dp[i][j]:跳到第i个位置第j个跑道所需要的最小侧跳次数
int n = obstacles.size();
vector<vector<long>> dp(n, vector<long>(3, INT_MAX));
dp[0][0] = 1;
dp[0][1] = 0;
dp[0][2] = 1;
for(int i = 1; i < n; ++i){
//实际无障碍物的情况,直接更新
if(obstacles[i] != 1) dp[i][0] = dp[i-1][0];
if(obstacles[i] != 2) dp[i][1] = dp[i-1][1];
if(obstacles[i] != 3) dp[i][2] = dp[i-1][2];
//有障碍物的情况,从其它跑道侧跳的情况
if(obstacles[i] != 1) dp[i][0] = min(dp[i][0], min(dp[i][1], dp[i][2])+1);
if(obstacles[i] != 2) dp[i][1] = min(dp[i][1], min(dp[i][0], dp[i][2])+1);
if(obstacles[i] != 3) dp[i][2] = min(dp[i][2], min(dp[i][0], dp[i][1])+1);
}
return min(dp[n-1][0], min(dp[n-1][1], dp[n-1][2]));
}
};