动态规划求解tsp问题,动态规划求解tsp
1.最长公共子串(LCS) 1.1问题的描述
1.2有想法的动态规划。
下一步是找到状态之间的转换方程。
所以以‘hello world’和‘loop’为例,可以按照这个等式来填写。
1.3 Python代码def LCS (string 1,string 2):len 1=len(string 1)len 2=len(string 2)RES=[ 0 foriinrange(len 1)]forjinrange(len 21)]fori in len 1):if string 2(I-1)=string 1(j-1):RES[I][j]=RES[I-1][j]RES[I][j]RES[I]0,1,2,2,2,2,2,2 ],[0,0,1,2,2,2,
1.4找到特定的子序列。以下内容请参考blog Running07的动态规划最长公共子序列流程图:如果有两个字符串,分别如下。
S1="123456778 "
S2="357486782 "
动态计划的最终结果如下。
S1和S2并不只有一个LCS。
根据递归公式:
上表是做出来的。
通过递推公式,res[i][j]的值来自res[i-1][j]或res[i-1][j]和res[i][j-1]
可能相等
中的较大值。S1和S2的LCS是从最后一个元素c[8][9]反向销售的。
决议[8][9]=5和S1[8]!=S2[9],所以推回去。res[8][9]的值来自c[8][8]的值(由于res[8][8] res[7][9])。
由于res[8][8]=5,S1[8]=S2[8],所以res[8][8]的值来自res[7][7]。
就是这样,如果你遇到S1[我]!=S2[j]并且有一个分支比如res[i-1][j]=res[i][j-1],这里选择任意方向(那么,在这种情况下,也选择相同的方向)。都是左或上)。
S1和S2的LCS是{3,5,7,7,8}
这是遇见相等的时候,统一往左走
。S1和S2之间还有一架LCS
这是遇见相等的时候,统一往上走
。S1和S2的LCS是{3,4,6,7,8}。
2.最长公共子串2.1问题描述
2.2思路和最长公共子串一样,使用动态规划的算法。
下一步是找到状态之间的转换方程。
与LCS问题的唯一区别是成为一个[我]!=B[j],res[i][j]直接为0。为什么这么说?因为子字符串必须是连续的。
且res[i][j] 表示的是以A[i],B[j]截尾的公共子串的长度
因此,以“helloworld”和“loop”为例,可以根据这个等式进行填充。与LCS问题的另一个区别是需要设置res,并且每一步都要更新最长公共子串的长度。
2.3 Python代码defLCstring(string1,string 2):len 1=len(string 1)len 2=len)string 2)RES=[0 foriinrange(len 1)]forjinrange(len 21)]result len