题解 | #牛牛吃草#
牛牛吃草
https://www.nowcoder.com/practice/f05254f070944ff792c0dfefabd94fec
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int n = in.nextInt(); int[] weights = new int[n+1]; int[] distances = new int[n+1]; for(int i=1;i<=n;i++){ weights[i] = in.nextInt(); } for(int i=1;i<=n;i++){ distances[i] = in.nextInt(); } int result = maxGrassEating(weights,distances,n); System.out.println(result); } public static int maxGrassEating(int[] weights,int[] distances,int n){ int maxWeight = 0; int[] dp = new int[n+1]; for(int i=n;i>0;i--){ dp[i] = weights[i]; for(int j=i+distances[i];j<=n;j+=distances[i]){ dp[i] = Math.max(dp[i],weights[i]+dp[j]); } maxWeight = Math.max(dp[i],maxWeight); } return maxWeight; } }
maxGrassEating
方法接受三个参数:草地上的草量数组weights
,每块草地向右走的距离数组distances
,以及草地的数量n
。- 通过动态规划的方法,计算从每块草地出发的最大草量,并最终返回一次吃草之旅中的最大草量。
- 在外层循环中,从最后一块草地开始,逐步计算每块草地的最大草量。
- 内层循环考虑了从当前草地出发,根据规定的步长能够到达的下一个草地,并选择具有最大草量的那一块。
dp
数组用于存储每块草地出发的最大草量。maxWeight
记录整个问题的解,即一次吃草之旅中的最大草量。