题目:
分析:
一道不错的dp。
每一列需要进行传递,但是最优值是不能确定的,跟新完这个,那个的最优值才能出现,因此,我的处理方式是多几轮,很好,很妙
周赛题,代码就只追求通过了。
代码:
class Solution {
public:
int minSideJumps(vector<int>& obstacles) {
vector<int> v(3,0);
vector<vector<int> > vv(obstacles.size(),v);
vv[0][0]=1;
vv[0][1]=0;
vv[0][2]=1;
for(int i=1;i<obstacles.size();i++)
{
int c=obstacles[i];
if(c==0)
{
vv[i][0]=vv[i-1][0];
vv[i][1]=vv[i-1][1];
vv[i][2]=vv[i-1][2];
vv[i][0]=min(vv[i][0],min(vv[i][1],vv[i][2])+1);
vv[i][1]=min(vv[i][1],min(vv[i][0],vv[i][2])+1);
vv[i][2]=min(vv[i][2],min(vv[i][1],vv[i][0])+1);
vv[i][0]=min(vv[i][0],min(vv[i][1],vv[i][2])+1);
vv[i][1]=min(vv[i][1],min(vv[i][0],vv[i][2])+1);
vv[i][2]=min(vv[i][2],min(vv[i][1],vv[i][0])+1);
vv[i][0]=min(vv[i][0],min(vv[i][1],vv[i][2])+1);
vv[i][1]=min(vv[i][1],min(vv[i][0],vv[i][2])+1);
vv[i][2]=min(vv[i][2],min(vv[i][1],vv[i][0])+1);
continue;
}
vv[i][c-1]=1<<30;
if(c==1)
{
vv[i][1]=vv[i-1][1];
vv[i][2]=vv[i-1][2];
vv[i][1]=min(vv[i][1],vv[i][2]+1);
vv[i][2]=min(vv[i][2],vv[i][1]+1);
vv[i][1]=min(vv[i][1],vv[i][2]+1);
vv[i][2]=min(vv[i][2],vv[i][1]+1);
}
if(c==2)
{
vv[i][0]=vv[i-1][0];
vv[i][2]=vv[i-1][2];
vv[i][0]=min(vv[i][0],vv[i][2]+1);
vv[i][2]=min(vv[i][2],vv[i][0]+1);
vv[i][0]=min(vv[i][0],vv[i][2]+1);
vv[i][2]=min(vv[i][2],vv[i][0]+1);
}
if(c==3)
{
vv[i][1]=vv[i-1][1];
vv[i][0]=vv[i-1][0];
vv[i][1]=min(vv[i][1],vv[i][0]+1);
vv[i][0]=min(vv[i][0],vv[i][1]+1);
vv[i][1]=min(vv[i][1],vv[i][0]+1);
vv[i][0]=min(vv[i][0],vv[i][1]+1);
}
}
return min(vv[obstacles.size()-1][1],min(vv[obstacles.size()-1][0],vv[obstacles.size()-1][2]));
}
};