leetcode之2140.解决智力问题

本文介绍了如何通过从深度优先搜索(DFS)改写为动态规划来解决智力问题中的最长路径问题,强调了从递归到状态转移的转变以避免超时。
摘要由CSDN通过智能技术生成

题目

2140.解决智力问题
一眼动态规划
简单动态规划 超时dfs做法:dfs肯定超时,但是为了更加清晰说明动态规划,新手可先写dfs,再进行改成动态规划

class Solution {
public:
    long long mostPoints(vector<vector<int>>& questions) {
        vector<vector<int>> maps(questions.size(), vector<int>(100, 0)); 
        function<int(int)> dfs = [&](int index){
            if(index>=questions.size()) return 0;
            int ans_1 = dfs(index+1);
            //解决
            int ans_2 = dfs(index+questions[index][1]+1)+questions[index][0];
            return max(ans_1, ans_2);
        };
        return dfs(0);
    }
};

动态规划

class Solution {
public:
    long long mostPoints(vector<vector<int>>& questions) {
        int n = questions.size();
        vector<long long> f(n+1, 0);
        for(int i=n-1;i>=0; i--){
        
            int nexts = questions[i][1]+i+1;
            long long ans_1 = f[i+1]; // 不解决当前前问题
            // 超过了就为当前值
            long long ans_2 = (nexts<=n)?(f[nexts]+questions[i][0]):static_cast<long long>(questions[i][0]); // 解决当前问题
            f[i] = max(ans_1, ans_2);
        }
        return f[0];
    }
};
class Solution:
    def mostPoints(self, questions: List[List[int]]) -> int:
        n = len(questions)
        f = [0]*(n+1)

        for i in range(n-1, -1, -1):
            next_index = i+questions[i][1]+1
            ans_1 = f[i+1]
            if next_index<=n:
                ans_2 = f[next_index]+questions[i][0]
            else:
                ans_2 = questions[i][0]
            
            f[i] = max(ans_1, ans_2)
        return f[0]

ans_2中等于不等于n都行,因为开辟了n+1个,此时无论如何都是当前的分数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值