力扣3290.最高乘法得分

力扣3290.最高乘法得分

递归 + 记忆化搜索

  • 对于b数组,从右往左考虑取不取如果取 则问题变成b[0] ~ b[i-1]间找j - 1个数

    • 如果不取 ,则问题变成b[0] ~ b[i]间找j个数
    • 即dfs(i,j) = max(dfs(i-1,j) , dfs(i-1,j-1) + a[j] * b[i])
  • 边界:dfs(i,-1) = 0,dfs(-1,j>=0) = -INF

  • 终点:dfs(n-1,3);

  • 同时引入记忆化搜索,因为只要参数一致,每次的结果都一样,所以遍历过的就不用再遍历

    • 初始化成INF即可
cpp 复制代码
  class Solution {
  public:
      long long maxScore(vector<int>& a, vector<int>& b) {
          int n = b.size();
          //用vector<long long>也可以
          //需要一个一个填充
          vector<array<long long,4>> memo(n);
          for(auto &row : memo)
              ranges::fill(row,LLONG_MIN);
          auto dfs = [&](auto &&dfs,int i,int j) -> long long {
              //j == -1
              if(j < 0)
                  return 0;
              if(i < 0)  //非法
                  return LLONG_MIN / 2;
              //引用取出memo[i][j],如果没更新过,就求res的同时更新
              auto &res = memo[i][j];
              if(res == LLONG_MIN)
                  res = max(dfs(dfs,i-1,j) , dfs(dfs,i-1,j-1) + (long long)a[j] * b[i]);
              return res;
          };
          return dfs(dfs,n-1,3);
      }
  };

1:1递推

  • f[i+1][j+1] 的定义和dfs(i,j)的定义一样

    • dfs(-1,j>=0) = -INF也翻译,为f[0][j] = -INF;
cpp 复制代码
  class Solution {
  public:
      long long maxScore(vector<int>& a, vector<int>& b) {
          int n = b.size();
          vector<array<long long,5>> f(n+1);
          //初始化
          for(int j=1;j<5;j++)
              f[0][j] = LLONG_MIN / 2;
          for(int i = 0;i<n;i++)
              for(int j=0;j<4;j++)
                  f[i+1][j+1] = max(f[i][j+1],f[i][j] + (long long)a[j] * b[i]);
          return f[n][4];
      }
  };
相关推荐
Coovally AI模型快速验证23 分钟前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
可为测控1 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨1 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
BoBoo文睡不醒2 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end2 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹3 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
银河梦想家3 小时前
【Day23 LeetCode】贪心算法题
leetcode·贪心算法
CM莫问3 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别
sz66cm4 小时前
LeetCode刷题 -- 45.跳跃游戏 II
算法·leetcode
Amor风信子4 小时前
华为OD机试真题---战场索敌
java·开发语言·算法·华为od·华为