感想
每次都做不出竞赛的最后一道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()];
}
};