LeetCode 1458. 两个子序列的最大点积(动态规划,类似编辑距离)
1. 題目
給你兩個數組 nums1 和 nums2 。
請你返回 nums1 和 nums2 中兩個長度相同的 非空 子序列的最大點積。
數組的非空子序列是通過刪除原數組中某些元素(可能一個也不刪除)后剩余數字組成的序列,但不能改變數字間相對順序。
比方說,[2,3,5] 是 [1,2,3,4,5] 的一個子序列而 [1,5,3] 不是。
點積:
定義 a=[a1,a2,…,an]a = [a1, a2,…, an]a=[a1,a2,…,an] 和 b=[b1,b2,…,bn]b = [b1, b2,…, bn]b=[b1,b2,…,bn] 的點積為:
a?b=∑i=1naibi=a1b1+a2b2+?+anbn\mathbf{a} \cdot \mathbf{b}=\sum_{i=1}^{n} a_{i} b_{i}=a_{1} b_{1}+a_{2} b_{2}+\cdots+a_{n} b_{n}a?b=i=1∑n?ai?bi?=a1?b1?+a2?b2?+?+an?bn?
這里的 ΣΣΣ 指示總和符號。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/max-dot-product-of-two-subsequences
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- dp[i][j]dp[i][j]dp[i][j] 表示截至nums1第 i 個數,nums2第 j 個數的最大點積
- if(dp[i-1][j-1] > 0)
dp[i][j]=max?(dp[i?1][j?1]+nums1[i?1]?nums2[j?1],max?(dp[i?1][j],dp[i][j?1]))dp[i][j] = \max(dp[i-1][j-1]+nums1[i-1]*nums2[j-1] ,\max(dp[i-1][j],dp[i][j-1]))dp[i][j]=max(dp[i?1][j?1]+nums1[i?1]?nums2[j?1],max(dp[i?1][j],dp[i][j?1])) - 否則if(dp[i-1][j-1] <= 0),另立門戶nums1[i-1]*nums2[j-1]
dp[i][j]=max?(nums1[i?1]?nums2[j?1],max?(dp[i?1][j],dp[i][j?1]))dp[i][j] = \max(nums1[i-1]*nums2[j-1] ,\max(dp[i-1][j],dp[i][j-1]))dp[i][j]=max(nums1[i?1]?nums2[j?1],max(dp[i?1][j],dp[i][j?1])) - 代碼跟編輯距離很類似
36 ms 13.4 MB
總結
以上是生活随笔為你收集整理的LeetCode 1458. 两个子序列的最大点积(动态规划,类似编辑距离)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 265. 粉刷房子 I
- 下一篇: LeetCode 672. 灯泡开关 Ⅱ