python数据结构与算法第十六天【贪心算法与动态规划】

时间:2023-03-08 22:43:47

对于一个字符串,对字符串进行分割,分割后的每个子字符串都为回文串,求解所有可行的方案

这个问题可以使用贪心算法与动态规划来求解

步骤如下:

(1)先得出所有的单个字符的回文串,单个字符必定是回文串, 若substr = string[i:j+1]且为回文串,则记为p[i][j] = True

(2)若p[i][j]=True且str[i-1]=str[j+1], 则p[i-1][j+1]也为回文串

python数据结构与算法第十六天【贪心算法与动态规划】

python数据结构与算法第十六天【贪心算法与动态规划】

思考:给定一些1元,2元,5元的纸币,问至少需要多少张,才能达到总价值为N

题目:给定一个长度为N的数组,找出最长递增子序列;例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8}, 则其最长的单调递增子序列为{5, 6, 7, 8}, 长度为4

python数据结构与算法第十六天【贪心算法与动态规划】

python数据结构与算法第十六天【贪心算法与动态规划】

python数据结构与算法第十六天【贪心算法与动态规划】

求解最长单调递增子序列的长度如下:

python数据结构与算法第十六天【贪心算法与动态规划】

求解最长单调递增子序列本身:

python数据结构与算法第十六天【贪心算法与动态规划】

代码实现(使用python实现如下)

#!/usr/bin/env python
#! _*_ coding:UTF-8  _*_

def lis():
    global data
    # longest[i]表示以data[i]结尾的最长单增子序列的长度
    global longest
    # 求解的结果, 最长单增子序列的长度
    global nlis
    global prefix
    global result

    size = len(data)

    #首先对longest进行初始化
    for i in range(size):
        longest.append(1)

    #遍历生成中间结果
    for i in range(1, size, 1):
        for j in range(i):
            if data[j] <= data[i]:
                longest[i] = max(longest[i], longest[j] + 1)

        nlis = max(nlis, longest[i])

if __name__ == "__main__":
    data = [1, 4, 5, 6, 2, 3, 8, 9, 10, 11, 12, 12, 1]
    longest = []
    nlis = 0
    prefix = []
    result = []
    lis()
    print longest

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/bat_day16/lis_test.py
[1, 2, 3, 4, 2, 3, 5, 6, 7, 8, 9, 10, 2]

Process finished with exit code 0