动态规划问题,找到转移方程即可
class Solution {
public:
int minSideJumps(vector<int>& obstacles) {
vector<vector<int>> dp(4,vector<int>(obstacles.size(),0));
dp[1][0]=INT_MAX,dp[2][0]=0,dp[3][0]=INT_MAX;
for(int i=1;i<obstacles.size();++i){
if(obstacles[i]==0){//if no block
dp[1][i]=dp[1][i-1],dp[2][i]=dp[2][i-1],dp[3][i]=dp[3][i-1];
}else{//if block,update from 1 to 3 dp[1-3][i]
for(int j=1;j<=3;++j){
if(obstacles[i]==j){
dp[j][i]=INT_MAX;
}else{
dp[j][i]=INT_MAX;
for(int k=1;k<=3;++k){//consider [i-1]'s situation
if(dp[k][i-1]==INT_MAX) continue;
if(k==j)
dp[j][i]=min(dp[j][i],dp[k][i-1]);
else {
if(obstacles[i]==k && obstacles[i-1]==j)//have to jump twice,important
dp[j][i]=min(dp[j][i],dp[k][i-1]+2);
else
dp[j][i]=min(dp[j][i],dp[k][i-1]+1);
}
}
}
}
}
}
int res=INT_MAX;
res=min(res,dp[1][obstacles.size()-1]);
res=min(res,dp[2][obstacles.size()-1]);
res=min(res,dp[3][obstacles.size()-1]);
return res;
}
};