题目: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])
}