力扣刷题 1458. 两个子序列的最大点积

1458. 两个子序列的最大点积

class Solution {
public:
    int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size(),n=nums2.size();
        int dp[m][n];
        // 第一种方法,初始化涵盖在转移过程中
        // for(int i=0;i<m;++i){
        //     for(int j=0;j<n;++j){
        //         int product=nums1[i]*nums2[j];
        //         dp[i][j]=product;
        //         if(i>0){
        //             dp[i][j]=max(dp[i-1][j],dp[i][j]);
        //         }
        //         if(j>0){
        //             dp[i][j]=max(dp[i][j-1],dp[i][j]);
        //         }
        //         if(i>0&&j>0){
        //             dp[i][j]=max(dp[i][j],dp[i-1][j-1]+product);  
        //         }
        //     }
        // }
        // return dp[m-1][n-1];


        // 第二种方法,标准动态规划:初始化+转移方程
        //初始化
        dp[0][0]=nums1[0]*nums2[0];
        for(int i=1;i<m;++i){
            int tmp=nums1[i]*nums2[0];
            dp[i][0]=max(dp[i-1][0],tmp);
        }
        for(int j=1;j<n;++j){
            int tmp=nums1[0]*nums2[j];
            dp[0][j]=max(dp[0][j-1],tmp);
        }

        //状态转移
        for(int i=1;i<m;++i){
            for(int j=1;j<n;++j){
                int product=nums1[i]*nums2[j];
                dp[i][j]=max(max(dp[i][j-1],dp[i-1][j]),max(max(product,dp[i-1][j-1]+product),dp[i-1][j-1]));  
            }
        }
        return dp[m-1][n-1];
    }
};
posted on 2021-06-11 09:15  雾恋过往  阅读(38)  评论(0编辑  收藏  举报

Live2D