【第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()];
    }
};

在這裏插入圖片描述

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