持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
最近一直在力扣刷题,也逐渐对各类题型有了自己的理解,所谓见招拆招,将自己的浅显经验分享一下,帮助更多在编程路上的朋友们。
今天遇到了一个特别有意思的题,很值得分享出来,题目如下:
不相交的线
在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。
现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:
nums1[i] == nums2[j] 且绘制的直线不与任何其他连线(非水平线)相交。 请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。
以这种方法绘制线条,并返回可以绘制的最大连线数。
示例如下
初步摸索
第一眼看到这个题目是懵的,根本想不出来怎么做,感觉上会靠近DFS,但是还要保存前置状态,而且感觉上DFS就会超时。
实在是无从写起,愣了好久还是看了题解,恍然大悟,这题竟然是动态规划???
正确思路
这是一道二维的动态规划题目,因为是求连线数,所以dp[i][j]定义为从开头算起,nums1的 i 位置和nums2的 j 位置上的可连线数。
初始值很简单,如果是空数组的话,无法与任何数组有连线,所以i为0或者j为0时,连线数均为0
-
如果nums[i] == nums[j],则dp[i][j] = dp[i - 1][j - 1] + 1
-
如果nums[i] != nums[j], 则dp[i][j] 为上一个状态中连线最多的,即Math.max(dp[i - 1][j], dp[i][j - 1];
最终结果为dp[nums1.length][nums2.length]
这道题也是在求两个数组的最长公共子序列,只不过是换了一种描述,说成线的话,很容易让人想不到,每次遇到动态规划都会被教育...