第一个成员开始正好走到数组最后一个成员所使用的最小步骤数(三种方法)

import java.util.*; public class Main {

static int min = Integer.MAX_VALUE;
public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    while(in.hasNextInt()){
        int n = Integer.parseInt(in.next());
        int[] arr = new int[n];
        for(int i=0; i<n; i++){
            arr[i] = in.nextInt();
        }
        System.out.println(df(arr, 0, 0) +" " + dp(arr, 0) + " " + dt(arr));
    }
}

public static int df(int[] arr, int i, int k){
    if(arr.length <= 2) return 1;
    if(i == arr.length - 1) return k;
    if(i >= arr.length) return -1;
    if(i == 0){
        int min = arr.length;
        for(int j=1; j<arr.length/2; j++){
            int t = df(arr, i+j, k+1);
            if(t>0){
                min = Math.min(min, t);
            }
        }
        return min==arr.length?-1:min;
    }
    return df(arr, i+arr[i], k+1);
}

public static int dp(int[] arr, int i){
    if(arr.length <= 2) return 1;
    if(i == arr.length - 1) return 0;
    if(i >= arr.length) return -1;
    int res = arr.length;
    if(i == 0){
        for(int j=1; j<arr.length/2; j++){
            int t = dp(arr, i+j);
            if(t > 0){
                res = Math.min(res, t);
            }
        }
        res = res==arr.length?-1:res+1;
    } else {
        int t = dp(arr, i+arr[i]);
        res = t<0?-1:t+1;
    }
    return res;
}

public static int dt(int[] arr){
    if(arr.length <= 2) return 1;
    int[] dt = new int[arr.length];
    dt[0] = 0;
    dt[1] = 1;
    for(int i=2; i<arr.length; i++){
        if(i<arr.length/2){
            dt[i] = 1;
        } else{
            dt[i] = i+1;
            for(int j=1; j<i; j++){
                if(dt[j] < 0) continue;
                int count = 1;
                int index = j;
                while(index < i){
                    index += arr[index];
                    count++;
                }
                if(index == i){
                    dt[i] = Math.min(dt[i], count);
                }
            }
            if(dt[i] > i) dt[i] = -1;
        }
    }
    return dt[arr.length-1];
}

}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 大厂实习和小厂实习最大的区别是什么? #
2477次浏览 20人参与
# 参加完秋招的机械人,还参加春招吗? #
119948次浏览 761人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
18833次浏览 307人参与
# 牛友の3月总结 #
1881次浏览 28人参与
# 这些公司卡简历很严格 #
95210次浏览 417人参与
# 面试被问到不会的问题,你怎么应对? #
692次浏览 8人参与
# 厦门银行科技岗值不值得投 #
9869次浏览 253人参与
# 拼多多工作体验 #
52687次浏览 342人参与
# 研究所VS国企,该如何选 #
259071次浏览 2013人参与
# 通信硬件知识分享 #
48135次浏览 538人参与
# 找AI工作可以去哪些公司? #
17113次浏览 755人参与
# 从事AI岗需要掌握哪些技术栈? #
14951次浏览 850人参与
# 你做过最难的笔试是哪家公司 #
47513次浏览 762人参与
# 实习最想跑路的瞬间 #
130959次浏览 740人参与
# 金三银四,你的春招进行到哪个阶段了? #
24583次浏览 297人参与
# 说说你知道的学历厂 #
391008次浏览 1379人参与
# AI面会问哪些问题? #
36247次浏览 1080人参与
# 想给25届机械人的秋招建议 #
47740次浏览 251人参与
# 机械人避雷的岗位/公司 #
62887次浏览 395人参与
# 大厂无回复,继续等待还是奔赴小厂 #
343363次浏览 1988人参与
# 滴!实习打卡 #
814713次浏览 6858人参与
# 我心目中的理想工作是这样的 #
100873次浏览 907人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务