题解 | #不能连续吃草的牛II#

不能连续吃草的牛II

https://www.nowcoder.com/practice/0b6e9ca056eb4166b4bfd4f7c90b2c61

知识点:动态规划

思路:

  1. 首先,定义一个名为eatGrass的静态方法,该方法接受一个整数数组作为参数,并返回一个整数。
  2. 创建一个二维整数数组f,大小为1005 × 2,用于记录状态。
  3. 获取整数数组nums的长度n
  4. 如果n等于1,直接返回数组中唯一的元素nums[0]作为结果。
  5. 如果n等于2,返回数组中两个元素中的较大值作为结果。
  6. 初始化一个变量res为0,用于记录最大的累计值。
  7. 针对不同的情况进行计算:不取第n间,取第1间,不取第2间:使用一个循环从3到n-1,更新状态数组f。对于当前位置i,分别考虑不取第n间和取第n间两种情况。不取n-1间,取第n间,不取第一间:使用一个循环从2到n-2,更新状态数组f。对于当前位置i,分别考虑不取第一间和取第一间两种情况。第1间和n间都不取:使用一个循环从2到n-1,更新状态数组f。对于当前位置i,分别考虑不取第1间和取第1间两种情况。
  8. 在每种情况结束后,更新res为当前情况的累计值与res的较大值。
  9. 返回res作为最终的结果。
  10. main方法中,创建一个示例用法,将一个整数数组作为参数传递给eatGrass方法,并打印出能够吃到的最大草量。

编程语言:java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public static int eatGrass(int[] nums) {
        int[][] f = new int[1005][2];
        int n = nums.length;
        if (n == 1) return nums[0];
        if (n == 2) return Math.max(nums[0], nums[1]);

        int res = 0;

        // 不取第n间 取第1间, 不取第2间
        for (int i = 3; i < n; i++) {
            f[i][0] = Math.max(f[i - 1][0], f[i - 1][1]);
            f[i][1] = f[i - 1][0] + nums[i - 1];
        }
        res = Math.max(res, Math.max(f[n - 1][0], f[n - 1][1]) + nums[0]);

        // 不取n - 1间 取第n间 不取第一间
        for (int i = 2; i < n - 1; i++) {
            f[i][0] = Math.max(f[i - 1][0], f[i - 1][1]);
            f[i][1] = f[i - 1][0] + nums[i - 1];
        }
        res = Math.max(res, Math.max(f[n - 2][0], f[n - 2][1]) + nums[n - 1]);

        // 第1间和n间 都不取
        for (int i = 2; i < n; i++) {
            f[i][0] = Math.max(f[i - 1][0], f[i - 1][1]);
            f[i][1] = f[i - 1][0] + nums[i - 1];
        }
        res = Math.max(res, Math.max(f[n - 1][0], f[n - 1][1]));

        return res;
    }
}

全部评论

相关推荐

01-17 12:35
吉首大学 Java
秋招之BrianGriffin:自己的工作自己做!😡
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务