(LeetCode 每日一题)2140. 解决智力问题(深度优先搜索dfs+记忆化 || 动态规划dp)

题目:2140. 解决智力问题在这里插入图片描述

在这里插入图片描述

方法一:深度优先搜索dfs+记忆化,时间复杂度为0(n)。
C++版本:

class Solution {
public:
    vector<vector<long long>> sta; 
    long long dfs(int u ,vector<vector<int>>& question,int n){
        if(u>=n) return 0;
        if(sta[u][0]==-1)  sta[u][0]=dfs(u+1,question,n);
        if(sta[u][1]==-1) sta[u][1]=question[u][0]+dfs(u+question[u][1]+1,question,n);
        return max(sta[u][0],sta[u][1]);

    }
    long long mostPoints(vector<vector<int>>& questions) {
        int n=questions.size();
        sta=vector<vector<long long>>(n,vector<long long>(2,-1));
        return dfs(0,questions,n);
    }
};

JAVA版本:

class Solution {
    long[][] sta; 
    long dfs(int u ,int[][] question,int n){
        if(u>=n) return 0;
        if(sta[u][0]==-1)  sta[u][0]=dfs(u+1,question,n);
        if(sta[u][1]==-1)  sta[u][1]=question[u][0]+dfs(u+question[u][1]+1,question,n);
        return Math.max(sta[u][0],sta[u][1]);

    }
    public long mostPoints(int[][] questions) {
        int n=questions.length;
        sta=new long[n][2];
        for(long[] x:sta){
            Arrays.fill(x,-1);
        }
        return dfs(0,questions,n);
    }
}

Go版本:

func mostPoints(questions [][]int) int64 {
    n := len(questions)
    sta := make([][]int64,n)
    for i := range sta{
        sta[i] = make([]int64,2)
        sta[i][0],sta[i][1] = -1,-1
    }
    var dfs func(int) int64
    dfs = func( u int) int64{
        if u>=n {
            return 0;
        }
        if sta[u][0] == -1 {
            sta[u][0]= dfs(u+1)
        }
        if sta[u][1] == -1 {
            sta[u][1] = int64(questions[u][0]) + dfs(u+questions[u][1]+1)
        }
        if sta[u][0] > sta[u][1] {
            return sta[u][0]
        }
        return sta[u][1]

    }
    return dfs(0)
}

方法二:动态规划dp,时间复杂度0(n)。
C++版本:

class Solution {
public:
     
    long long mostPoints(vector<vector<int>>& questions) {
        int n=questions.size();
        vector<vector<long long>> f(n+1,vector<long long>(2,0));
        for(int i=n-1;i>=0;i--){
            f[i][0]=max(f[i+1][0],f[i+1][1]);
            f[i][1]=questions[i][0];
            int tmp=i+questions[i][1]+1;
            if(tmp<n)f[i][1]+=max(f[tmp][0],f[tmp][1]);
        }
        return max(f[0][0],f[0][1]);
    }
};

JAVA版本:

class Solution {
    
    public long mostPoints(int[][] questions) {
        int n=questions.length;
        long[][] f=new long[n+1][2];
        for(int i=n-1;i>=0;i--){
            f[i][0]=Math.max(f[i+1][0],f[i+1][1]);
            f[i][1]=questions[i][0];
            int tmp=i+questions[i][1]+1;
            if(tmp<n)f[i][1]+=Math.max(f[tmp][0],f[tmp][1]);
        }
        return Math.max(f[0][0],f[0][1]);
    }
}

Go版本:

func mostPoints(questions [][]int) int64 {
    n := len(questions)
    sta := make([][]int64,n+1)
    for i := range sta{
        sta[i] = make([]int64,2)
    }
    for i := n-1;i>=0;i--  {
        sta[i][0] = max(sta[i+1][0], sta[i+1][1])
        sta[i][1] = int64(questions[i][0])
        tmp := i+questions[i][1]+1
        if tmp<n {
            sta[i][1]+=max(sta[tmp][0],sta[tmp][1])
        }
    } 
    return max(sta[0][0],sta[0][1])
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值