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