感想
每次都做不出競賽的最後一道dp,QAQ。
話說這次有一下子測好多樣例的功能,點贊!
思路
講真,這題不難,我的腦子估計是被第三道樹傷害後掉線了。
定義
dp[i][j]
:nums1前i個元素
與nums2前j個元素
子序列的最大點積。
初始化
四周都設計爲INT_MIN
,避免越界。
遞推公式
考慮nums1[0~i-1]和nums2[0~j]
,nums1[0~i]和nums2[0~j-1]
,nums1[0~i]和nums2[0~j]
.
dp[i][j]=max(max(dp[i-1][j],dp[i][j-1]),res);
其中res表示本次i和j選入點積子序列,考慮dp[i-1][j-1]如果是正值就把前面這段接上,如果負值就不要了。
class Solution {
public:
int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size()+1,vector<int>(nums2.size()+1,INT_MIN));
int res=0;
for(int i=1;i<=nums1.size();i++)
{
for(int j=1;j<=nums2.size();j++)
{
res=nums1[i-1]*nums2[j-1]+(dp[i-1][j-1]>=0?dp[i-1][j-1]:0);
dp[i][j]=max(max(dp[i-1][j],dp[i][j-1]),res);
}
}
return dp[nums1.size()][nums2.size()];
}
};