您的位置:首页 > 汽车 > 时评 > 中国经济网_乌鲁木齐企业电话黄页_写软文一篇多少钱合适_叶涛网站推广优化

中国经济网_乌鲁木齐企业电话黄页_写软文一篇多少钱合适_叶涛网站推广优化

2024/10/7 7:11:37 来源:https://blog.csdn.net/sjsjs11/article/details/142732126  浏览:    关键词:中国经济网_乌鲁木齐企业电话黄页_写软文一篇多少钱合适_叶涛网站推广优化
中国经济网_乌鲁木齐企业电话黄页_写软文一篇多少钱合适_叶涛网站推广优化

给你两个数组 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

动态规划

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]。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com