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];
}
};