编辑距离+动态规划

编辑距离

在这里插入图片描述
典型的动态规划题目,初看无从下手,但按照动态规划套路一步步来也不是很难。
动态规划步骤:
1、确定初始边界条件。
2、确定状态转移方程。
3、写代码。
先解释一下什么是初始边界条件

边界条件

动态规划一般是多变量之间的相互作用,正常人脑(反正当初我刚刚接触动态规划是头疼+心态爆炸)难以一下子考虑 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 分别取什么值使得 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) ,也就是数学中常说的控制变量法。

状态转移方程

这个是所有动态规划题目中最重要的一环,笔者尝试找到一个固定的套路可以解决大部分动态规划问题,发现暂时还做不到,可能是题目做少的原因。不得不说,动态规划是真的难!!!
本题的状态转移方程为:在这里插入图片描述

写代码

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)

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39529891/article/details/104469527