最长重复子数组
给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。
这里考虑使用动态规划,像是这种输出一个值的题,而且有这种迭代的感觉的题,一般考虑动态规划的思路。
栋态规划的思路在于状态转移和迭代。
试想一个长度为5和一个长度为4的数组的最长子数组,如果要状态转移,至少要保证状态连续,因此dp的装态可以设置为以该索引为右端的最长子数组,dp[4][3]就可以表示成由最后一个数字做右端构成的最长子数组。很显然,如果A[4]!=B[3],那么dp[4][3]为0.如果A[4]==B[3],那么dp[4][3]=dp[3][2]+1,这就是转移方程。
下面就是如何进行规划,初始值怎么定。这里由于转移方程上一个状态索引都在上一行,所以横着扫就可以了。
这里要注意的是,二维dp数组绝对不能这么创建 dp = [[[0](len(A)+1)](len(B)+1)],这么创建,所有的子列表的指针都是一段地址。
代码如下:
dp = [[0 for x in range(len(A)+1)] for y in range(len(B)+1)] res = 0 for i in range(1,len(B)+1): for j in range(1,len(A)+1): if B[i-1]==A[j-1]: dp[i][j]=dp[i-1][j-1]+1 res = max(dp[i][j],res) return res