编辑距离+动态规划

  • Post author:
  • Post category:其他




编辑距离

在这里插入图片描述

典型的动态规划题目,初看无从下手,但按照动态规划套路一步步来也不是很难。

动态规划步骤:

1、确定初始边界条件。

2、确定状态转移方程。

3、写代码。

先解释一下什么是初始边界条件



边界条件

动态规划一般是多变量之间的相互作用,正常人脑(反正当初我刚刚接触动态规划是头疼+心态爆炸)难以一下子考虑



f

x

1

,

x

2

.

.

.

.

x

n

f(x_1,x_2….x_n)






f






x










1


















,





x










2


















.


.


.


.



x










n
























中n个变量,然后一口报出来



x

1

,

x

2

.

.

.

.

x

n

x_1,x_2….x_n







x










1


















,





x










2


















.


.


.


.



x










n





















分别取什么值使得



f

f






f





最大或最小。所以我们一般先考虑



f

(

x

1

,

0

,

0….0

)

f

(

0

,

x

2

,

0….0

)

.

.

.

.

.

.

.

f

(

0

,

0

,

0….

x

n

)

f(x_1,0,0….0)、f(0,x_2,0….0)…….f(0,0,0….x_n)






f


(



x










1


















,




0


,




0


.


.


.


.


0


)





f


(


0


,





x










2


















,




0


.


.


.


.


0


)


.


.


.


.


.


.


.


f


(


0


,




0


,




0


.


.


.


.



x










n


















)





,也就是数学中常说的控制变量法。



状态转移方程

这个是所有动态规划题目中最重要的一环,笔者尝试找到一个固定的套路可以解决大部分动态规划问题,发现暂时还做不到,可能是题目做少的原因。不得不说,动态规划是真的难!!!

本题的状态转移方程为:
在这里插入图片描述



写代码

import numpy as np
b="apple"
a="rad"
lena=len(a)
lenb=len(b)
dis=np.zeros((lena+1,lenb+1))
path=nd_test = np.full(shape=((lena+1,lenb+1)),fill_value='a5i')
#初始化有一个字符串长度为0的情况
for i in range(lena+1):
    for j in range(lenb+1):
        if(i==0):
            dis[i][j]=j 
            path[i][j]="→"
        elif(j==0):
            dis[i][j]=i
            path[i][j]="↓"
        elif (a[i-1]!=b[j-1]):
            dis[i][j]=min(dis[i-1][j]+1,dis[i][j-1]+1,dis[i-1][j-1]+1)
            if dis[i][j]==dis[i-1][j]+1:
                path[i][j]="↓"
            elif dis[i][j]==dis[i][j-1]+1:
                path[i][j]="→"
            else:
                path[i][j]="↓→"
        else:
            dis[i][j]=dis[i-1][j-1]
            path[i][j]="↓.→"
print("距离矩阵为:")        
print(dis)
print("来的时候的路径")
print(path)
for i in range(lena+1):
    for j in range(lenb+1):
        if(path[i][j]=="→"):
            path[i][j]="←"
        elif(path[i][j]=="↓"):
            path[i][j]="↑"
        elif (path[i][j]=="↓.→"):
            path[i][j]="←.↑"
        else:
            path[i][j]="←↑"
print("回去的路径")
print(path)

运行结果:

在这里插入图片描述



版权声明:本文为weixin_39529891原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。