【第190场周赛】Leetcode-1458 两个子序列的最大点积

感想

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

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章