题解 | #牛牛吃草#
牛牛吃草
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);
}
}


查看3道真题和解析