LeetCode 1458. 两个子序列的最大点积 (经典双串)

两个子序列的最大点积

状态: d p [ i ] [ j ] dp[i][j] dp[i][j]表示s1序列[1,i]和s2序列[1,j]所能获得最大点积。

大致思路和LCS的思路非常相似。
时间复杂度: O ( m ∗ n ) O(m*n) O(mn)
但是初值的设置以及决策的多样需要注意。

  • 因为要求最大值,初值初始化负无穷大。
  • 因为不能一个都不选,所以至少会有a1[0]*a2[0]。
class Solution {
    
    
public:
    int maxDotProduct(vector<int>& a1, vector<int>& a2) {
    
    
        int n = a1.size(), m = a2.size();
        vector<vector<int>> dp(n,vector<int>(m,-1e9));
        dp[0][0] = a1[0]*a2[0];
        for(int i=0;i<n;i++){
    
    
            for(int j=0;j<m;j++){
    
    
                if(i) dp[i][j] = max(dp[i][j],dp[i-1][j]); //a1第i个数不选
                if(j) dp[i][j] = max(dp[i][j],dp[i][j-1]); //a2第j个数不选
                if(i && j) dp[i][j] = max(dp[i][j],dp[i-1][j-1]+a1[i]*a2[j]); //a1第i个数选、a2第j个数也选
                dp[i][j] = max(dp[i][j],a1[i]*a2[j]); //如果a1[i]和a2[j]选的话,前面可以一个都不选
            }
        }
        return dp[n-1][m-1];
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/108351696