第一次 递归
int jump_res(int *arr,int n,int cur)
{
if (cur>=n-1)
return 0;
int minv = Inf;
for (int i=1;i<=arr[cur];i++)
{
int tempv = 1+jump_res(arr,n,cur+i);
if (minv>tempv)
{
minv = tempv;
}
}
return minv;
}
int jump(int A[], int n) {
return jump_res(A,n,0);
}第二次 DP
int jump(int A[],int n)
{
int *dp = new int[n];
dp[0] = 0;
for (int i=1;i<n;i++)
{
if (i<A[0])
dp[i] = 1;
else
dp[i] = 100000;
}
if(dp[n-1]==1)
return 1;
for (int i=1;i<n-1;i++)//to the n-1, A[n-1] is not important
{
for (int k=1;k<=A[i];k++)
{
if (i+k<n&&dp[i]+1<dp[i+k])
{
dp[i+k] = dp[i] + 1;
}
}
}
return dp[n-1];
delete[] dp;
}还是time limited第三次 DP带优化的
int jump(int A[],int n)
{
int *dp = new int[n];
dp[0] = 0;
for (int i=1;i<n;i++)
{
if (i<=A[0])
dp[i] = 1;
else
dp[i] = 100000;
}
if(dp[n-1]==1)
return 1;
for (int i=1;i<n;i++)//to the n-1, A[n-1] is not important
{
if (A[i]<A[i-1])// this optimization is important
continue;
for (int k=1;k<=A[i]&&i+k<n;k++)
{
if (i>=k&&A[i]+k<=A[i-k])//A[i-k] would be more close than A[i] to A[n-1]
continue;
if (dp[i]+1<dp[i+k])
{
dp[i+k] = dp[i] + 1;
}
}
}
return dp[n-1];
delete[] dp;
}通过了

本文详细介绍了通过递归、动态规划两种方法解决跳跃问题的过程,从基本递归方法到使用动态规划进行优化,最终通过改进的动态规划方法成功解决了时间限制问题。
617

被折叠的 条评论
为什么被折叠?



