【动态规划-最长公共子序列(LCS)】【hard】力扣1458. 两个子序列的最大点积

给你两个数组 nums1 和 nums2 。

请你返回 nums1 和 nums2 中两个长度相同的 非空 子序列的最大点积。

数组的非空子序列是通过删除原数组中某些元素(可能一个也不删除)后剩余数字组成的序列,但不能改变数字间相对顺序。比方说,[2,3,5] 是 [1,2,3,4,5] 的一个子序列而 [1,5,3] 不是。

示例 1:

输入:nums1 = [2,1,-2,5], nums2 = [3,0,-6]

输出:18

解释:从 nums1 中得到子序列 [2,-2] ,从 nums2 中得到子序列 [3,-6] 。

它们的点积为 (23 + (-2)(-6)) = 18 。

示例 2:

输入:nums1 = [3,-2], nums2 = [2,-6,7]

输出:21

解释:从 nums1 中得到子序列 [3] ,从 nums2 中得到子序列 [7] 。

它们的点积为 (3*7) = 21 。

示例 3:

输入:nums1 = [-1,-1], nums2 = [1,1]

输出:-1

解释:从 nums1 中得到子序列 [-1] ,从 nums2 中得到子序列 [1] 。

它们的点积为 -1 。

提示:

1 <= nums1.length, nums2.length <= 500

-1000 <= nums1[i], nums2[i] <= 100

动态规划

cpp 复制代码
class Solution {
public:
    int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size(), n = nums2.size();
        // 初始化 dp 数组为一个极小的值 INT_MIN,因为点积可能为负数
        vector<vector<int>> dp(m+1, vector<int>(n+1, INT_MIN));

        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                int product = nums1[i-1] * nums2[j-1];
                dp[i][j] = max({
                    product,                 // 只选择当前元素对
                    dp[i-1][j],              // 不选择 nums1[i-1]
                    dp[i][j-1],              // 不选择 nums2[j-1]
                    dp[i-1][j-1] == INT_MIN ? product : dp[i-1][j-1] + product // 检查溢出
                });
            }
        }

        return dp[m][n];
    }
};

这道题是LCS的变形,dp[i][j] 表示使用 nums1 的前 i 个元素和 nums2 的前 j 个元素时,能够得到的最大点积。

在计算dp[i][j]的时候有四种情况:

一种是我们只选择product这个元素对,

一种是不选择当前元素对,由dp[i-1][j]的状态转移而来。

一种是不选择当前元素对,由dp[i][j-1]的状态转移而来。

一种是选择当前元素对,并且对dp[i-1][j-1]检查是否是INT_MIN情况,防止出现k为负数时的溢出。然后由之前的状态dp[i-1][j-1]加上该元素对。

由于我们要求的是最大点积,那么就从这四种情况中选取最大的情况。

最后返回dp[m][n]。

相关推荐
chao1898443 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
沪漂阿龙3 小时前
AI大模型面试题:支持向量机是什么?间隔最大化、软间隔、核函数、LinearSVC 全面拆解
人工智能·算法·支持向量机
little~钰3 小时前
倍增算法和ST表
算法
知识领航员4 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
薛定e的猫咪4 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法
如何原谅奋力过但无声5 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
平行侠5 小时前
037插入排序 - 整理扑克牌的算法
数据结构·算法
ECT-OS-JiuHuaShan6 小时前
彻底定理化:从量子纠缠到量子代谢
数据库·人工智能·学习·算法·生活·量子计算
爱喝雪碧的可乐6 小时前
2026 腾讯广告算法大赛优秀方案启示:行为条件化多模态自回归生成推荐摘要
算法·数据挖掘·回归·推荐系统·推荐算法