这回的跳跃游戏是用二维表写的
嗯,比递归强
就是觉得之前的贪心不是很对吧
思路就是找到每一步经历的最小步数然后放到每行的最前面
由于认定【0,0】走了0步所以无法判断数组长度为1的
纵坐标代表当前在的位置,横坐标代表当前的步数,如果跳跃的过程中到了最后的位置,就可以跳出了
上代码
之前想用队列存储各个经历过的坐标,结果发现没啥用,只有当前位置的最小步数是有用的,所以,取消了结构体数组
int jump(int* nums, int numsSize)
{
int max=nums[0],s=0,t=0;
for(int i=0;i<numsSize;i++)
{
if(max<nums[i])
max=nums[i];
}
int dp[10000][max+1];
for(int i=0;i<10000;i++)
{
for(int j=0;j<(max+1);j++)
dp[i][j]=INT_MAX;
}
dp[0][0]=0;
int i=0,m=0,flag=1;
while(flag==1&&(numsSize)!=1)
{for(int j=1;j<=nums[i];j++)
{
dp[i+j][j]=fmin(dp[j+i][j],dp[i][m]+1);
if(dp[i+j][j]<dp[i+j][0])
dp[i+j][0]=dp[i+j][j];
if((i+j)==(numsSize-1)){flag=0;break;}
}
dp[i][m]=-1;
for(i=0;dp[i][0]==INT_MAX||dp[i][0]==-1;i++);m=0;}
int min=dp[numsSize-1][0];
for(int i=0;i<(max+1);i++)
{
if(dp[numsSize-1][i]<min)
min=dp[numsSize-1][i];
}
return min;
}
再次编辑于2021/4/6
之前用二维数组写发现没什么意义,整道题的实现原理类似于是队列, 按照层序的想法来说的话(只要控制每个位置存进去的是最小的步数就可以)后面位置的数一定要比前面位置的数大的,所以现在前面找到能最先到达最后的点一定是最小的
最先跳的数都是1,把1跳完了之后再跳2
如果是在1那块跳的,跳了一步到了最后的位置,那么这个步数一定比在2跳一步到最后要少
因此找到的话直接就返回
int jump(int* nums, int numsSize)
{
int max=nums[0],s=0,t=0;
for(int i=0;i<numsSize;i++)
{
if(max<nums[i])
max=nums[i];
}
int dp[10000];
for(int i=0;i<10000;i++)
{
for(int j=0;j<(max+1);j++)
dp[i]=INT_MAX;
}
dp[0]=0;
int i=0,m=0,flag=1;
while(flag==1&&(numsSize)!=1)
{for(int j=1;j<=nums[i];j++)
{
dp[i+j]=fmin(dp[i+j],dp[i]+1);
if((i+j)==(numsSize-1)){flag=0;break;}
}
dp[i]=-1;
for(i=0;dp[i]==INT_MAX||dp[i]==-1;i++);
}
return dp[numsSize-1];
}