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

embedded/2024/11/13 15:24:09/

文章目录

    • 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/embedded/114503.html

相关文章

cpp中的namespace详解

namespace的作用主要是为了避免名字冲突和组织代码。 命名空间在C中是一个非常重要的特性&#xff0c;它帮助开发者更好地管理代码和避免潜在的冲突。 具体来说&#xff0c;它有以下几个主要用途 避免名字冲突 在大型项目中可能会有很多个类、函数或变量使用相同的名称。使用…

音频北斗定位系统有什么用?

在当今科技飞速发展的时代&#xff0c;定位技术已经成为我们日常生活和各行各业不可或缺的一部分。其中&#xff0c;音频北斗定位系统作为一种新兴的定位技术&#xff0c;正逐渐展现出其独特的优势和应用价值。那么&#xff0c;到底音频北斗定位系统有什么用呢?我们一起来了解…

Webpack 和 Vite 的区别

Webpack 是一种模块打包工具&#xff0c;主要功能是将各种资源&#xff08;如 JavaScript、CSS、图片等&#xff09;通过 loader 和 plugin 转换和打包成可以直接在浏览器中运行的代码。其核心思想是以代码分割、按需加载和优化资源来提升性能。 Vite 是一种新型构建工具&…

智慧火灾应急救援:无人机、直升机航拍视角下的火灾应急救援检测数据集代码

智慧火灾应急救援&#xff1a;无人机、直升机航拍视角下的火灾应急救援检测数据集 引言 随着科技的发展&#xff0c;无人机、直升机等飞行器在火灾应急救援中的应用越来越广泛。这些飞行器不仅能快速到达火场&#xff0c;而且可以通过搭载的高清摄像机和其他传感器获取火场的…

Activiti7《第三式:破刀式》——工作流中的刀锋利刃

冲冲冲&#xff01;开干 这篇文章将分为九个篇章&#xff0c;带你逐步掌握工作流的核心知识。欢迎来到 “破刀式” 篇章&#xff01;在工作流的开发过程中&#xff0c;锋利的利器就是 精湛的设计与代码优化。本篇文章将探讨如何像一把利刃一样&#xff0c;用最直接的方式切入复…

数据库语言、SQL语言、数据库系统提供的两种语言

1.数据库语言 数据库语言有很多种&#xff0c;其中一种是SQL语言。 2. SQL语言 【几乎所有的关系数据库系统都使用SQL语言。】 SQL语言中包含很多不同的部分&#xff0c;有&#xff1a; &#xff08;1&#xff09;DDL语言&#xff08;Data definition language&#xff09;…

flink doris批量sink

idea maven 依赖 <dependency> <groupId>org.apache.doris</groupId> <artifactId>flink-doris-connector-1.11_2.12</artifactId> <version>1.0.3</version> </dependency> val properties Properties() properties.setPro…

在SpringBoot项目中利用Redission实现布隆过滤器(布隆过滤器的应用场景、布隆过滤器误判的情况、与位图相关的操作)

文章目录 1. 布隆过滤器的应用场景2. 在SpringBoot项目利用Redission实现布隆过滤器3. 布隆过滤器误判的情况4. 与位图相关的操作5. 可能遇到的问题&#xff08;Redission是如何记录布隆过滤器的配置参数的&#xff09;5.1 问题产生的原因5.2 解决方案5.2.1 方案一&#xff1a;…