承接我上一个博客内容,用了另一个算法伪代码来记录
大佬的博客
对于动态算法来说,其实就是一个自下向上的过程,即从已知的内容来回推位置的内容,就像这题一样,我们已知的是重点,所以我们就可以开始回推那一步是终点的前一个点。思路就是首先需要标记到终点这个位置是可以正确的,然后一个for循环从终点的前一个位置开始,判断那个位置到终点的步数中,可否能到达。
#include <stdio.h>
#include <stdlib.h>
//以下是伪代码
//首先是一个记录每一步的步数和位置的数组,数组下标是位置,数组里内容是步数
int a[100];
//其次便是一个dp的数组,来判断这个位置可不可以到达终点
int dp[100];
//然后就开始写方法
bool jum_can(a){
dp[len(a)-1]=1;//先标记终点这个位置是可以到终点的(也就是已知解)
for(int i=len(a)-2;i>=0;i--){//从后往前推
//先判断能走的最长的步数
int long_step=min(len(a)-1,a[i]+i);//也就是数组长度减一和当前位置加上当前位置的步数
//进行步数内的第二次循环,判断能不能到达
for(int j=0;j<=long_step;j++){
if(dp[j+a[i]==1)//说明当前位置加上步数是能到达的
{
dp[i]=1;//如果那个步数能达到,就说明这个位置能达到
}
}
}
if(dp[0]==1){//就是第一个位置能不能达到
return true;
}
else
return false;
}
//最后在主函数处
int main()
{
//创建数组并输入数组数据
int a[100];
//(跳过输入部分)
if(jum_can(a))//从0开始
printf("可以到达");
else
printf("不可以到达");
return 0;
}