Skip to content

【动态规划】- 718.最长重复子数组dp定义有歧义 #2981

@Aapolaris

Description

@Aapolaris

本题提供了两种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]
Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions