[Mdp] lc3290. 最高乘法得分(二维dp+状态定义+状态转移+LCS问题+好题+周赛415_2)

ops/2024/10/18 16:55:03/

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:3290. 最高乘法得分

类似:

  • [Mdp] lc3259. 超级饮料的最大强化能量(dp+状态表示+状态转移+状态机dp+周赛411_2)

2. 题目解析

挺不错的题目,纠结了一会贪心解法,但是没有什么卵用,证明不出来,代码难写。还是老老实实回归到 dp 求解吧。纠结程度和 [Mdp] lc3259. 超级饮料的最大强化能量(dp+状态表示+状态转移+状态机dp+周赛411_2) 一模一样…

思路:

  • 状态定义:f[i][j]:在 b 中前 i 个与 a 中前 j 个字符所满足要求的最大得分。
  • 状态转移:采用 选、不选 的状态转移思路:
    • b[i] 不选:f[i][j] = f[i-1][j]
    • b[i] 选:f[i][j]=f[i-1][j-1] + a[i] * b[j]
  • 状态初始化:
    • 空间开辟要注意:共有 n 个数,需要开 n+1 个空间,因为是选 0、选1、选…、选 n 个。
    • 一开始都初始化最小值。针对 a 中一个都不选的情况,得分均为 0,所以 f[i][0] = 0;

总结:

  • 能不贪心,就别贪心。
  • 此类二维 dp 可以参考下 LCS 问题,有类似的状态定义及转移。
  • 对于空间开辟,此类选不选问题,需要额外开辟一个空间。
  • 本题的要求:b 数组选取的四个数是有序的。实际上可以思考下,dp 方程的 状态计算、状态转移 是恰好满足这个要求的。对于 f[4][2] 来讲,它要么是从 f[3][2] 转移,要么是从 f[3][1] 转移。

本问题抽象一下就有:

  • a 数组有 n1 个数,b 数组有 n2 个数,且 n1 <= n2。
  • 要求从 b 数组随机选中 n1 个数,按下标排序后。与 a 数组中的对应位置元素进行 f 函数的运算。
  • 求 f 函数的最值。
  • 这里的 f 函数给即有 加、减、乘、除 等运算。

  • 时间复杂度 O ( n m ) O(nm) O(nm)
  • 空间复杂度 O ( n m ) O(nm) O(nm)

代码:

常规写法:

class Solution {
public:long long maxScore(vector<int>& a, vector<int>& b) {typedef long long LL;int n = b.size(), m = a.size();vector<vector<LL>> f(n + 1, vector<LL>(m + 1, -1e18));f[0][0] = 0;for (int i = 1; i <= n; i++)for (int j = 0; j <= 4; j++) {f[i][j] = f[i - 1][j];if (j > 0) f[i][j] = max(f[i][j], f[i - 1][j - 1] + (LL)a[j - 1] * b[i - 1]);}return f[n][4];}
};

简洁写法:更容易理解。

class Solution {
public:long long maxScore(vector<int>& a, vector<int>& b) {typedef long long LL;int n = b.size(), m = a.size();vector<vector<LL>> f(n + 1, vector<LL>(m + 1, -1e18));for (int i = 0; i <= n; i ++ ) f[i][0] = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= 4; j++) f[i][j] = max(f[i - 1][j], f[i - 1][j - 1] + (LL)a[j - 1] * b[i - 1]);return f[n][4];}
};

http://www.ppmy.cn/ops/111524.html

相关文章

MME-RealWorld:您的多模态大型语言模型能挑战高分辨率的真实世界场景吗?这些场景对人类来说都非常困难!

论文名称&#xff1a;MME-RealWorld: Could Your Multimodal LLM Challenge High-Resolution Real-World Scenarios that are Difficult for Humans? 论文链接&#xff1a;https://arxiv.org/abs/2408.13257 项目主页&#xff1a;https://mme-realworld.github.io/ 代码链接…

Redis模拟消息队列实现异步秒杀

目录 一、消息队列含义 二、Redis实现消息队列 1、基于List的结构模拟实现消息队列 2、基于PubSub的消息队列 3、基于Stream的消息队列 4、基于Stream的消息队列- 消费者组 一、消息队列含义 消息队列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放…

opencv羊群计数,动态目标检测跟踪

OpenCV&#xff08;开源计算机视觉库&#xff09;是一个功能强大的计算机视觉和图像处理库&#xff0c;广泛应用于各种视觉任务中&#xff0c;包括但不限于目标检测与跟踪。如果你正在考虑一个基于OpenCV的羊群计数项目&#xff0c;那么下面是对这样一个项目的概述&#xff1a;…

【Android安全】Ubuntu 16.04安装GDB和GEF

1. 安装GDB sudo apt install gdb-multiarch 2. 安装GEF(GDB Enhanced Features) 官网地址&#xff1a;https://github.com/hugsy/gef 2.1 安装2021.10版本 但是在Ubuntu 16.04上&#xff0c;bash -c "$(curl -fsSL https://gef.blah.cat/sh)"等命令不好使&…

MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式,光标下方永远会出现的CapsLock箭头Icon的去除办法

如图&#xff0c;MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式下&#xff0c;光标下方永远会出现一个CapsLock箭头Icon。此Icon挡住视野&#xff0c;还容易误触导致切换大小写状态&#xff0c;带来的收益远远小于带来的困扰。 解决办法 打开终端&#xff0c;输入以下…

shader 案例学习笔记之常用函数封装

二维旋转矩阵&#xff08;原点旋转&#xff09; vec2 rotate2D(vec2 _st,float _angle){_st - 0.5;_st mat2(cos(_angle),-sin(_angle),sin(_angle),cos(_angle));_st 0.5;return _st;} 二维平移矩阵 vec2 translate2D(vec2 _st,float tx,float ty){_st.x _st.x tx;_st.y…

大数据-128 - Flink 并行度设置 细节详解 全局、作业、算子、Slot

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…