[ python ] 动态规划笔记 [二] 序列型动态规划

序列型动态规划

在这里插入图片描述
第一步:确定状态
· 最优策略是花费最少的策略
· 最后一步:花费最少的策略中,房子N-1一定被染成了红、绿、蓝三种颜色中的一种
· 但是相邻两栋房子不能染成同样的颜色
· 如果套用以前的思路,记录前N座房子最小花费,根据套路,也要记录前N-1座房子的最小花费,但是前N-1座房子中,不知道房子N-2是什么颜色,所以有可能和房子N-1撞色。
· **所以,->不知道房子N-2是什么颜色,就把它记录下来。**分别记录油漆前N-1栋房子并且房子N-2是红色、蓝色、绿色的最小花费。

子问题:求油漆前N栋房子并且房子N-1是红色、蓝色、绿色的最小花费。
状态:设油漆前i栋房子并且房子i-1是红色、蓝色、绿色的最小花费分别为f[i][0]、f[i][1]、f[i][2]
在这里插入图片描述
在这里插入图片描述

解法如下:

class Solution:
    def calculate(self, N, cost):
		#red指第N个房子为红的情况,blue、green同理
        red, blue, green = cost[0][0], cost[0][1], cost[0][2]
        for i in range(1, N):
            red,blue,green = min(blue + cost[i][0], green + cost[i][0]),min(red + cost[i][1], green + cost[i][1]), min(red + cost[i][2], blue + cost[i][2])
        return min(red, blue, green)

总结:
1、序列型动态规划:…前i个…最小/方式数/可行性
2、如果只用f(N-1)将无法区分
3、解决方法:记录下N-2的情况


在这里插入图片描述
确定状态:
· 解密数字串即划分成若干段数字,每段数字对应一个字母
· 最后一步(最后一段),对应一个字母
· 这个字母加密时变成1,2…,或者26
在这里插入图片描述
在这里插入图片描述
所以解密方式应该是100+50种————

**得到子问题->**知道数字串前N-1和前N-2个字符的解密方式

得到状态方程:设数字串S前i个数字解密成字母串有f[i]种方式

转移方程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution:
    def calculate(self, str):
        n = len(str)
        f = [0] * (n+1)

        f[0] = 1
        if n == 0:
            return 0
        for i in range(1, n+1):
            #判断最后一位
            t = ord(str[i-1]) - ord('0')
            if t >= 1 and t <= 9:
                f[i] += f[i-1]

            #判断最后两个地址
            if i >= 2:
                t = (ord(str[i-2]) - ord('0')) * 10 + (ord(str[i-1]) - ord('0'))
                if t >= 10 and t <= 26:
                    f[i] += f[i-2]
        return f[n]

猜你喜欢

转载自blog.csdn.net/Sgmple/article/details/113103552