题解 | #牛牛吃草#

牛牛吃草

https://www.nowcoder.com/practice/f05254f070944ff792c0dfefabd94fec

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] w = new int[n];
        int[] a = new int[n];
        for(int i=0;i<n;i++){
            w[i] = in.nextInt();
        }
        for(int i=0;i<n;i++){
            a[i] = in.nextInt();
        }

        int res = 0;
        //存储每个节点能获得的最大值,从后往前
        int[] tt = new int[n];

        for(int i = n-1;i>=0;i--){
            if(i + a[i]>=n){
                //如果它跳一步就超出数组边界,那么它的最大就是它本身
                tt[i] = w[i];
            }else{
                int temp = 0;
                /**
                 * 这里最容易出问题,我在这里卡了很久
                 * 注意,a[i] 代表 他可以跳【1】下,但是这一下的距离可以是【n * a[i]】,需要遍历找出那个倍数最大,
                 * 我们从后往前的原因也在此,后边的值都存在tt数组里
                 * 【容易犯的错误(我犯得)】: 对于每个i 下一步直接就是i + a[i] 造成错误
                 */
                for(int j = i + a[i];j<n;j = j+a[i]){
                    temp = Math.max(temp,w[i]+tt[j]);
                }
                tt[i] = temp;
            }
            res = Math.max(res,tt[i]);
        }
        System.out.println(res);
    }
}

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务