本题提供了两种dp定义:
dp[i][j]表示以i-1结尾的数组1和以j-1为结尾的数组2的最长重复子数组
dp[i][j]表示以i结尾的数组1和以j为结尾的数组2的最长重复子数组
每种定义有不同的写法。但不论是哪一种,根据代码计算出来的dp[i][j]都不符合它的定义。
这里以第二种为例,以下是第二种定义对应的代码:
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp (nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
int result = 0;
// 要对第一行,第一列经行初始化
for (int i = 0; i < nums1.size(); i++) if (nums1[i] == nums2[0]) dp[i][0] = 1;
for (int j = 0; j < nums2.size(); j++) if (nums1[0] == nums2[j]) dp[0][j] = 1;
for (int i = 0; i < nums1.size(); i++) {
for (int j = 0; j < nums2.size(); j++) {
if (nums1[i] == nums2[j] && i > 0 && j > 0) { // 防止 i-1 出现负数
dp[i][j] = dp[i - 1][j - 1] + 1;
}
if (dp[i][j] > result) result = dp[i][j];
}
}
return result;
}
};
则代码计算结果和实际结果的dp表如下所示。可以发现是不一样的,那么应该如何理解dp[i][j]呢

本题提供了两种dp定义:
dp[i][j]表示以i-1结尾的数组1和以j-1为结尾的数组2的最长重复子数组dp[i][j]表示以i结尾的数组1和以j为结尾的数组2的最长重复子数组每种定义有不同的写法。但不论是哪一种,根据代码计算出来的
dp[i][j]都不符合它的定义。这里以第二种为例,以下是第二种定义对应的代码:
则代码计算结果和实际结果的dp表如下所示。可以发现是不一样的,那么应该如何理解

dp[i][j]呢