这个题一看确实没什么思路,但是经过高手一提醒才发现,这个就是LCS问题。考虑必须是顺序的相等。dp的定义还是比较巧妙的,考虑两个数组0-i和0-j长度的LCS,这也是我们要考虑的子结构,之后填充就从上往下即可。
class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size(), n = nums2.size();
// dp[i][j]为0-i和0-j的LCS(1代表第一个字符)
int dp[m+1][n+1];
memset(dp, 0, sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(nums2[i-1] == nums1[j-1])dp[j][i] = dp[j-1][i-1]+1;
else dp[j][i] = max(dp[j-1][i], dp[j][i-1]);
}
}
return dp[m][n];
}
};