数据结构–递归/回溯/分治/动态规划

  • Post author:
  • Post category:其他




1.递归

将一个数据序列中的相同的数字放在同一个篮子中,使得每个篮子中的数字个数相同且每个篮子的个数大于等于2,若能恰好分红,则返回篮子个数,否则返回0.

比如 ‘2 2 3 3’, 将 两个2和两个3,分别放在一个篮子里,返回为2.

比如‘2 2 3 3 3’ 无法平均放入篮子,返回0

比如‘2 3 4 4 2 3 4 4’, 返回4.

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 24 19:43:12 2019

@author: janti
"""
        # In[]

def count_blankets(dicta,s,min_count):
    count=0
    flag=1
    while min_count>=2:
        for i in range(len(s)):
            if (dicta[s[i]] % min_count)==0:
                count+=dicta[s[i]]/min_count        
            else:
                flag=0
                count=0
                min_count-=1
                count_blankets(dicta,s,min_count)  
        if flag:
            break
    return count
# In[]

n=9
line='2 3 4 2 3 4 4 4 4'
dicta={}
s=[]
for i in range(n):
    data=int(line.split()[i])
    if data in dicta:
        dicta[data]+=1
    else:
        dicta[data]=1
        s.append(data)
        # In[]
min_count=1000        
for i in range(len(s)):
    if dicta[s[i]]<min_count:
        min_count=dicta[s[i]]
        
if min_count<2:
    res=0
else: 
    res=int(count_blankets(dicta,s,min_count))

print(str(res) + "\n")

通过LeetCode上【70. 爬楼梯】学习(建议)



2. 回溯



2.1 矩阵中的最长递增子序列

找出矩阵中的最长递增路径

import numpy as np          
def  Findlongpath(matrix,i,j,len_vect):
    if len_vect[i][j]:
        return len_vect[i][j]
    cols=len(matrix)
    rows=len(matrix[0])
    maxlen=0
    if i >0 and matrix[i-1][j]>matrix[i][j]:
        maxlen=max(maxlen,Findlongpath(matrix,i-1,j,len_vect))
    if i<cols-1 and matrix[i+1][j] > matrix[i][j]:
        maxlen=max(maxlen,Findlongpath(matrix,i+1,j,len_vect))
    if j>0 and matrix[i][j-1]>matrix[i][j]:
        maxlen=max(maxlen,Findlongpath(matrix,i,j-1,len_vect))
    if j<rows-1 and matrix[i][j+1] > matrix[i][j]:
        maxlen=max(maxlen,Findlongpath(matrix,i,j+1,len_vect))       
    len_vect[i][j] = maxlen+ 1
    return len_vect[i][j]
# In[]
matrix=[[2,3,4],[3,4,5],[6,7,8]]
cols=len(matrix)
rows=len(matrix[0])
max_len_matrix=1
len_vect=np.zeros((cols,rows))
for i in range(cols):
    for j in range(rows):
        len_vect[i][j]=Findlongpath(matrix,i,j,len_vect)
        max_len_matrix=max(max_len_matrix,len_vect[i][j])
print(max_len_matrix)  

参考链接:


https://www.cnblogs.com/fanmu/p/9636076.html

利用回溯算法求解 0-1 背包问题

在这里插入图片描述

利用回溯算法求解八皇后问题



3. 分治

利用分治算法求一组数据的逆序对个数



4. 动态规划



4.1 0-1 背包问题

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5、表格填完,最优解即是V(number,capacity)=V(4,8)=10。

6、代码实现:

(后期补充)

内容来自以下链接:


https://blog.csdn.net/qq_38410730/article/details/81667885



https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html



4.2 最长递增子序列

编程实现一个数据序列的最长递增子序列



参考链接:


https://blog.csdn.net/love20165104027/article/details/79618367

最小路径和(详细可看 Minimum Path Sum)

编程实现莱文斯坦最短编辑距离

编程实现查找两个字符串的最长公共子序列

对应的 LeetCode 练习题

实战递归:完成Leetcode上的Letter Combinations of a Phone Number(17)及permutations(46)

实战DP:完成0-1背包问题实现(自我实现)及Leetcode上Palindrome Partitioning II(132)

补充题目:leetcode198 House Robber

Regular Expression Matching(正则表达式匹配)

英文版:

https://leetcode.com/problems/regular-expression-matching/

中文版:

https://leetcode-cn.com/problems/regular-expression-matching/

Minimum Path Sum(最小路径和)

英文版:

https://leetcode.com/problems/minimum-path-sum/

中文版:

https://leetcode-cn.com/problems/minimum-path-sum/

Coin Change (零钱兑换)

英文版:

https://leetcode.com/problems/coin-change/

中文版:

https://leetcode-cn.com/problems/coin-change/

Best Time to Buy and Sell Stock(买卖股票的最佳时机)

英文版:

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/

中文版:

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

Maximum Product Subarray(乘积最大子序列)

英文版:

https://leetcode.com/problems/maximum-product-subarray/

中文版:

https://leetcode-cn.com/problems/maximum-product-subarray/

Triangle(三角形最小路径和)

英文版:

https://leetcode.com/problems/triangle/

中文版:

https://leetcode-cn.com/problems/triangle/



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