leetcode-2140 解决智力问题Java+DFS+记忆化搜索

leetcode-2140 解决智力问题

原题链接

问题描述

给你一个下标从 ​0 开始的二维整数数组 questions,其中 questions[i] = [points_i, brainpower_i]

这个数组表示一场考试中的一系列题目,你需要 ​按顺序​(从问题 0 开始依次解决)对每个问题选择 ​解决 或 ​跳过

  • 解决问题 i:获得 points_i 分,但必须跳过接下来的 brainpower_i 个问题。
  • 跳过问题 i:可以继续处理下一个问题。

返回你能获得的 ​最高分数


示例

示例 1

输入:​ questions = [[3,2],[4,3],[4,4],[2,5]]
输出:​ 5
解释:​

  • 解决问题 0 → 获得 3 分,跳过问题 12
  • 解决问题 3 → 获得 2 分。
    总分:​ 3 + 2 = 5(无法获得更高分数)。
示例 2

输入:​ questions = [[1,1],[2,2],[3,3],[4,4],[5,5]]
输出:​ 7
解释:​

  • 跳过问题 0
  • 解决问题 1 → 获得 2 分,跳过问题 23
  • 解决问题 4 → 获得 5 分。
    总分:​ 2 + 5 = 7(无法获得更高分数)。

提示

  • 1 <= questions.length <= 10^5
  • questions[i].length == 2
  • 1 <= points_i, brainpower_i <= 10^5

DFS+记忆化搜索

AC代码

class Solution {
    long[] memo;
    public long mostPoints(int[][] questions) {
        int n = questions.length;
        memo = new long[n];
        return dfs(questions,0);
    }
    public long dfs(int[][] questions,int index){
        if(index>=questions.length){
            return 0;
        }
        if(memo[index]!=0){
            return memo[index];
        }
        long sum = Long.MIN_VALUE;
        //选
        sum = Math.max(sum,questions[index][0]+dfs(questions,index+1+questions[index][1]));
        //不选
        sum = Math.max(sum,dfs(questions,index+1));
        //记忆化
        return memo[index] = sum;
    }
}

时间复杂度:O(n)

空间复杂度:O(n)

解题思路

看到题目第一眼结合数据范围以为是道贪心题目,因为和以前做过的一道题比较相似–跳跃游戏,但仔细想想这道题前面选择会影响后面似乎贪心无法解决,回顾一下数据范围在10^5内,于是尝试一下递归+记忆化搜索碰碰运气没想到还真过了,虽然是擦边过也记录一下吧哈哈哈

动态规划版本

注:因本人动态规划掌握的确实不太牢固 这里我就直接贴题解了

class Solution {
    public long mostPoints(int[][] questions) {
        int n = questions.length;
        long[] dp = new long[n + 1]; // 解决每道题及以后题目的最高分数
        for (int i = n - 1; i >= 0; i--) {
            dp[i] = Math.max(dp[i + 1], questions[i][0] + dp[Math.min(n, i + questions[i][1] + 1)]);
        }
        return dp[0];
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/solving-questions-with-brainpower/solutions/1233147/jie-jue-zhi-li-wen-ti-by-leetcode-soluti-ieuq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(leetcode,java,深度优先)