【状态机DP】【记忆化搜索及翻译递推】【空间优化】力扣3290. 最高乘法得分

news2024/10/19 8:56:01

给你一个大小为 4 的整数数组 a 和一个大小 至少为 4 的整数数组 b。

你需要从数组 b 中选择四个下标 i0, i1, i2, 和 i3,并满足 i0 < i1 < i2 < i3。你的得分将是 a[0] * b[i0] + a[1] * b[i1] + a[2] * b[i2] + a[3] * b[i3] 的值。

返回你能够获得的 最大 得分。

示例 1:
输入: a = [3,2,5,6], b = [2,-6,4,-5,-3,2,-7]

输出: 26

解释:
选择下标 0, 1, 2 和 5。得分为 3 * 2 + 2 * (-6) + 5 * 4 + 6 * 2 = 26。

示例 2:
输入: a = [-1,4,5,-2], b = [-5,-1,-3,-2,-4]

输出: -1

解释:
选择下标 0, 1, 3 和 4。得分为 (-1) * (-5) + 4 * (-1) + 5 * (-2) + (-2) * (-4) = -1。
在这里插入图片描述
记忆化搜索

class Solution {
public:
    long long maxScore(vector<int>& a, vector<int>& b) {
        int n = b.size();
        vector<array<long long, 4>> memo(n);
        for(auto& row : memo){
            ranges::fill(row, LLONG_MIN);
        }

        //j代表a[j]的索引,i代表b[i]的索引,只有在选择了目前状态后,才会有j-1或i-1。
        auto dfs = [&](auto&& dfs, int i, int j) -> long long{
            if(j < 0){
                return 0;
            }
            if(i < 0){
                return LLONG_MIN/2;
            }
            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);
    }
};

时间复杂度:O(mn),其中 m=4 是 a 的长度,n 是 b 的长度。由于每个状态只会计算一次,动态规划的时间复杂度 = 状态个数 × 单个状态的计算时间。本题状态个数等于 O(mn),单个状态的计算时间为 O(1),所以总的时间复杂度为 O(mn)。
空间复杂度:O(mn)。保存多少状态,就需要多少空间。

我们可以通过记忆化搜索,来让a数组从右往左的元素与b数组从右往左的元素一一匹配。
我们定义一个数组memo用于记忆化,储存递推的结果,避免重复运算。
我们在每次递推时候要进行判断,如果j小于0则a数组元素被选择完,返回0。如果a数组没被选择完的情况下,b数组被选择完,则返回一个非常小的负数LLONG_MIN/2,代表这种情况是不符合规范的,以这个为树子节点的路径是不成立的。

我们在定义递推的状态转换方程的时候,有两种情况,选择或者不选择b[i],如果选择了b[i],那么这时候a[j]会和b[i]相乘,a[j]和b[i]都被使用了,对应dfs(dfs, i-1, j-1) + (long long)a[j] * b[i]。如果不选择b[i],那么就让a[j]和b[i-1]进行匹配,对应代码dfs(dfs, i-1, j)

我们最后返回答案dfs(dfs, n-1, 3);他会作为树的头节点,然后不断向下搜索,然后在a被选择完的时候停止搜索,我们在搜索的过程中选择能构成最大答案的路径就是答案。


1:1翻译成递推

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];
    }
};

时间复杂度:O(mn),其中 m=4 是 a 的长度,n 是 b 的长度。
空间复杂度:O(mn)

翻译成递推,我们从前往后,用a数组的左边开始元素与b数组的左边开始元素一一对应。
首先我们定义一个二维数组f[i][j],代表a数组的前j个元素和b数组的前i个元素中,最大的乘法组合是多少。然后我们初始化边界条件,由于当没有任何b元素可以组合的时候,对应代码f[0][j] = LLONG_MIN/2;,代表这种状态是错误的。

空间优化

class Solution {
public:
    long long maxScore(vector<int>& a, vector<int>& b) {
        long long f[5]{};
        fill(f+1, f+5,LLONG_MIN/2);
        for(int y : b){
            for(int j = 3; j >= 0; j--){
                f[j+1] = max(f[j+1], f[j] + (long long)a[j] * y);
            }
        }
        return f[4];
    }
};

时间复杂度:O(mn),其中 m=4 是 a 的长度,n 是 b 的长度。
空间复杂度:O(m)

我们可以看到在方法二中,f[i+1][j+1]是由上面一行同一列元素和上一行的前一列元素的状态转移而来,也就是由正上方和左上方元素状态转移而来。所以我们可以采用滚动数组的方式,从后往前进行滚动,也就是说在计算f的时候,正上方的元素和左上方元素在这一轮都没有被覆盖,保留这上一轮循环的值,所以我们可以只用一个一维数组f来储存答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chromium form表单post提交过程分析c++

form表单get提交参考之前文章Chromium 前端form表单提交过程分析c-CSDN博客 一、表单post提交测试例子&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head&…

【C++11】可变模板参数详解

个人主页&#xff1a;chian-ocean 文章专栏 C 可变模板参数详解 1. 引言 C模板是现代C编程中一个非常强大且灵活的工具。在C11标准中&#xff0c;引入了可变模板参数&#xff08;variadic templates&#xff09;&#xff0c;它为模板编程带来了革命性改变。它的出现允许我们…

第五课:Python学习之if语句

判断&#xff08;if&#xff09;语句 目标 开发中的应用场景if 语句体验if 语句进阶综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的&#xff0c;我们每天都在做各种各样的选择&#xff0c;如果这样&#xff1f;如果那样&#xff1f;…… 程序中的判断 # 定义…

faust,一个神奇的 Python 库!

大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - faust。 Github地址&#xff1a;https://github.com/robinhood/faust 在分布式系统和实时数据处理的世界里&#xff0c;消息流处理&#xff08;Stream Processing&#xff09;变得越来越重要。Faust 是一个 Python 库…

Linux 命令:每日一学,一文说尽打包压缩工具实践

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 文章目录&#xff1a; 0x00 前言简述 前面&#xff0c;我们介绍了Linux中文件查找find命令以及与之联用最勤的xargs命令&#xff0c;作者以一个个简单的实例给各位看友展示了在运维中两个命令的使…

智慧供排水管网在线监测为城市安全保驾护航

一、方案背景 随着城市化进程的不断推进&#xff0c;城市供排水管网作为城市基础设施的关键组成部分&#xff0c;其安全稳定的运行对于确保城市居民的日常生活、工业生产活动以及整个生态环境的健康具有至关重要的作用。近年来&#xff0c;由于各种原因&#xff0c;城市供排水管…

Python基础:16、Python数据容器

1&#xff09;数据容器入门 一种可以存储多个元素的Python数据类型 数据容器&#xff1a;一种可以存储多个元素的Python数据类型数据容器包括&#xff1a;list&#xff08;列表&#xff09;、tuple&#xff08;元组&#xff09;、str&#xff08;字符串&#xff09;、set&…

k8s的安装与部署

一、部署 1、实验环境 k8s-master172.25.254.200k8s-node1172.25.254.10k8s-node2172.25.254.20docker-node1 172.25.254.100(harbor仓库&#xff09; 2、相关操作 1.基础配置 所有节点关闭selinux和防火墙 systemctl disabled firewalld systemctl stop firewalld grubb…

商贸物流产业大脑:打造“产-供-销,仓-运-配”全流程供应链

商贸物流产业大脑&#xff1a;打造“产-供-销&#xff0c;仓-运-配”全流程供应链 在全球化竞争日益激烈的今天&#xff0c;商贸物流产业的效率和创新力成为企业能否脱颖而出的关键因素。然而&#xff0c;信息不对称、资源配套不准确、系统独立运作等痛点严重阻碍了商贸物流产…

# LangGraph 入门(二)- ChatBot demo

在这个快速入门 demo 中&#xff0c;我们将会使用 langGraph 构建一个基本的对话机器人和可是使用网络搜索的机器人。通过这个 demo 我们来快速对 langgraph 有一定感知。 概念补充 顾名思义langGraph是基于图&#xff08;Graph Theory&#xff09;的&#xff0c;如果你学过图…

【算法】约瑟夫环问题

据说著名的犹太历史学家Josephus有过以下故事&#xff0c; 罗马人占领乔塔帕特&#xff0c; 39个犹太人与Josephus和他的朋友躲在洞中&#xff0c;其中39个犹太人决定自杀&#xff0c; &#xff0c;他们的自杀方式是41个人绕成一圈&#xff0c;第一个人报数1&#xff0c;报数到…

RK3588的demo板学习

表层的线宽是3.8mil: 换层之后线宽变成了4.2mil: (说明对于一根线&#xff0c;不同层线宽不同) 经典&#xff1a; 开窗加锡&#xff0c;增强散热&#xff0c;扩大电流&#xff1a; R14的作用&#xff1a;与LDO进行分压&#xff0c;降低LDOP的压差从而减小其散热&#xff1a;第…

如何系统的从0到1学习大模型?有哪些书籍推荐?

大模型应用得好&#xff0c;不仅需要海量的基础数据、大规模算力、综合人工智能发展成果的技术&#xff0c;还需要政产学研用各方的共同推进。 大模型不仅能生成结果、生成数据&#xff0c;更能传递价值观。应用于我国的大模型需要懂中文、懂中国文化、懂中国国情。大模型是全…

【Linux系统编程】环境基础开发工具使用

目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程​编辑​编辑​编辑 3.2 详解链接 动态链接 静态链接 4…

纯HTML实现标签页切换

纯HTML实现标签页切换 实现原理&#xff1a; HTML结构&#xff1a; 使用无序列表&#xff08;<ul>&#xff09;创建标签导航。每个标签是一个列表项&#xff08;<li>&#xff09;&#xff0c;包含一个链接&#xff08;<a>&#xff09;。每个链接指向对应的内…

商品计划:零售企业的痛点破解与运营优化指南

在现代零售业的激烈竞争中&#xff0c;商品计划不仅是企业盈利的关键&#xff0c;更是解决众多痛点的有效途径。零售企业在运营过程中常常面临各种挑战&#xff0c;如财务问题、库存管理、市场分析等。而科学、系统的商品计划可以帮助企业有效应对这些挑战&#xff0c;提升整体…

气膜:冰雪产业的创新解决方案—轻空间

随着冰雪运动的普及和发展&#xff0c;如何在不同季节和地区有效开展冰雪项目&#xff0c;成为了行业内的一个重要课题。气膜作为一种新兴的建筑形式&#xff0c;凭借其独特的优势&#xff0c;正在逐渐成为冰雪产业的创新解决方案。 优越的建筑特性 气膜建筑以其轻便、快速搭建…

Web Storage:数据储存机制

前言 在HTML5之前&#xff0c;开发人员一般是通过使用Cookie在客户端保存一些简单的信息的。在HTML5发布后&#xff0c;提供了一种新的客户端本地保存数据的方法&#xff0c;那就是Web Storage&#xff0c;它也被分为&#xff1a;LocalStorage和SessionStorage&#xff0c;它允…

【黑马redis高级篇】持久化

//来源[01,05]分布式缓存 除了黑马&#xff0c;还参考了别的。 目录 1.单点redis问题及解决方案2.为什么需要持久化&#xff1f;3.Redis持久化有哪些方式呢&#xff1f;为什么我们需要重点学RDB和AOF&#xff1f;4.RDB4.1 定义4.2 触发方式4.2.1手动触发save4.2.2被动触发bgsa…

软件工程:需求规格说明书(图书管理系统)

目录 1 导言 1.1 编写目的 1.2 参考资料 2 项目介绍 2.1 项目背景 2.2 项目目标 3 应用环境 3.1 系统运行网络环境 ​编辑 3.2 系统软硬件环境 4 功能模型 4.1 功能角色分析 4.1.1 图书管理员 4.1.2 普通读者 4.1.3 邮件系统 4.2 功能性需求 4.2.1 预定图…