![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
aaaqqq1234
这个作者很懒,什么都没留下…
展开
-
最长连续序列
class Solution(object): def longestConsecutive(self, nums): hash_dict = dict() max_length = 0 for num in nums: if num not in hash_dict: left = hash_dict.get(num - 1, 0) right原创 2020-10-21 09:54:58 · 113 阅读 · 0 评论 -
零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1class Solution: def coinChange(self, coins: List[int], amount: int) -> int: l原创 2020-10-21 09:51:42 · 167 阅读 · 0 评论 -
正则表达式匹配
class Solution: def isMatch(self, s: str, p: str) -> bool: dp = [[False for _ in range(len(s)+1)]for _ in range(len(p)+1)] string = '#'+s patten = '#'+p dp[0][0] = True for i in range(len(string)):原创 2020-09-07 22:08:54 · 61 阅读 · 0 评论 -
剪绳子
def cuttingRope(n): dp = [0]*(n+1) dp[1] = 1 for i in range(2,n+1): for j in range(1,i): temp = max(dp[j],j)*max(i-j,dp[i-j]) dp[i] = max(dp[i],temp) return dp[-1]原创 2020-09-06 19:38:49 · 63 阅读 · 0 评论 -
以最低的成本连接绳索
题目给下面5根绳子,两两相连,cost = 值相加,求连城一根时的最小花费input : [1,3,2,5,4]output 33思路贪心算法,求每两根绳子的最小花费即可代码def mincost(l): if len(l) == 0: return 0 if len(l) == 1: return l[0] if len(l) == 2: return l[0]+l[1] l.sort() dp = [0]*(len(l)) dp[0] = l原创 2020-07-30 20:58:42 · 212 阅读 · 0 评论 -
两个数字的最小和
题目给两个数字s,ms = 20 m = 3output: 299思路从低位到高位,低位尽量给足9,最高位要保留一个1代码def twonumsmallest(m,s): if s>9*m: return -1 if s == 0 or m == 0: return -1 res = [0 for i in range(1,m+1)] print(res) s = s-1 for i in range(m-1,0,-1): if s>原创 2020-07-30 15:46:34 · 232 阅读 · 0 评论 -
多重背包问题
题目多重背包问题思路在0,1背包问题的基础上,加一个for循环,控制拿k次。代码def morebag(coins,m,s): lenc = len(coins) dp = [[0 for _ in range(lenc+1)]for _ in range(m+1)] for i in range(1,m+1): dp[i][0] = float('inf') for i in range(1,lenc+1): for j in range(1,m+1):原创 2020-07-30 12:41:33 · 76 阅读 · 0 评论 -
完全背包问题
题目完全背包问题思路对于每一个物品,要么不拿,要么我拿,可以拿多个,dp[i][j] = min(dp[i-1][j],dp[i][j-value])代码def complete_bag(coins,m): lenc = len(coins) dp = [[0 for _ in range(lenc+1)]for _ in range(m+1)] for i in range(1,m+1): dp[i][0] = float('inf') for i in range(1,原创 2020-07-30 12:39:48 · 58 阅读 · 0 评论 -
最长递增子序列
题目求最长递增子序列的最长长度。思路dp一维数组记录,当前字符串递增的长度代码def lengthOfLIS2(nums): if not nums: return 0 dp = [1]*len(nums) for i in range (1, len(nums)): for j in range(i): if nums[i] >nums[j]: dp[i] = max(dp[i]原创 2020-07-30 12:31:38 · 70 阅读 · 0 评论 -
最长递增子序列的个数
题目给定一个未排序的整数数组,找到最长递增子序列的个数。思路加一个count数组,记录第几次遇到当前最长子序列,count[j]+1>count[i],则当前第一次遇到的最长的,count[j]+1 = count[i],则是当前遇到最长的且不是第一次遇到。代码class Solution: def findNumberOfLIS(self, nums: List[int]) -> int: if len(nums) == 0: retu原创 2020-07-30 12:19:30 · 150 阅读 · 0 评论 -
最长公共字符串
题目给定两个字符串,求两个字符串最长的公共长度。思路动态规划,creat一个两个字符串长度的二维矩阵,记录最大长度代码def lcs(x,y,m,n): dp = [[0 for _ in range(m+1)]for _ in range(n+1)] for i in range(1,n+1): for j in range(1,m+1): if x[j-1] == y[i-1]: dp[i][j] = dp[i-1][j-1] + 1 e原创 2020-07-28 20:17:10 · 100 阅读 · 0 评论 -
背包问题
题目背包问题思路当前背包的最大价值=max{前一个,和拿这一个的容量加上前面的容量最大值}代码def knapSack(capacity,weight,value,num): dp = [[0 for _ in range(num+1)]for _ in range(0,capacity+1)] for i in range(1,num+1): for j in range(1,capacity+1): if j >= weight[i-1]: d原创 2020-07-28 17:19:34 · 74 阅读 · 0 评论 -
最大正方形
标题input:matrix = [[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]output:4思路对于从第二行的任意一个点,他的值取决于它上面,左边,做上边的值。代码class Solution: def maximalSquare(self, matrix: List[List[str]]) -> int: if len(matrix)==0: return 0原创 2020-07-27 18:47:22 · 58 阅读 · 0 评论 -
买卖股票4
题目可以进行两次交易,先买在卖,下一次买时,上一次必须卖出求最大收益思路creat两个二维数组,global表示第i天的第j次收益的最大值,lacal表示第i天的第j次的最大收益,且第j次交易必须发生在第i天。代码def stock(s,k): length = len(s) dp_global = [[0 for _ in range(k)]for _ in range(length)] dp_local = [[0 for _ in range(k)] for _ i原创 2020-07-26 21:31:30 · 88 阅读 · 0 评论 -
买卖股票3
题目在上一题的基础上,要求交易时需要手续费k元思路creat两种状态,一个是钱,一个是股票。,然后dp每天的最大收益代码def stock3(s,k): length = len(s) dp = [[0 for _ in range(length)] for _ in range(0,2)] dp[0][0] = 0 dp[1][0] = -s[0] for i in range(1,len(s)): dp[0][i] = max(dp[0][i-1],dp[1][i-原创 2020-07-26 19:16:21 · 74 阅读 · 0 评论 -
买卖股票2
题目在上一题基础上,可以进行多次交易思路判断今天的价格和昨天的价格。代码def stock2(s): dp = [0]*len(s) dp[0] = 0 for i in range(1,len(s)): if s[i] > s[i-1]: dp[i] = dp[i-1] + (s[i]-s[i-1]) else: dp[i] = dp[i-1] return dp[-1]...原创 2020-07-26 18:22:44 · 94 阅读 · 0 评论 -
买卖股票1
题目给定一个数组表示每天的股票价格你可以进行一个股票交易先买在卖,问如何能得到最大利润思路动态规划,第i天的最大值一定是前一天和第i天的股票减去前面最小值。代码def stock1(s): dp = [0]*(len(s)) dp[0]=0 minprice = s[0] for i in range(1,len(s)): dp[i] = max(dp[i-1],s[i]-minprice) minprice = min(s[i],minprice) prin原创 2020-07-26 17:47:38 · 86 阅读 · 0 评论 -
输出合法的括号
题目给定一个n,要求输出所有的n对括号的组合。如n=2(()),()(),思路除了递归,还可以用动态规划,第一个出现的肯定是 ( ,对于每个‘)’的出现位置,肯定是在( 之后,假设n=1,只有一种()假设n=2,((,那么右括号的放置位置就有两个地方,就可以记为dp[0]*dp[1]+dp[1]*dp[0]n = 3 同理。代码def kuohao(n): dp = [0]*(s+1) dp[0] = dp[1] = 1 for i in range(2,s+1):原创 2020-07-26 13:21:31 · 228 阅读 · 0 评论 -
二叉搜索树的构造种数
题目给定一个排好序的数组,问有多少种bst的构造种类思路动态规划def bst_way(s): dp = [0]*(s+1) dp[0] = dp[1] = 1 for i in range(2,s+1): for left in range(0,i): dp[i] += dp[left] * dp[i-left-1] return dp[-1]...原创 2020-07-26 13:05:16 · 131 阅读 · 0 评论 -
解码方式
题目A message containing letters from A-Z is being encoded to numbers using the following mapping:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26Given an encoded message containing digits, determine the total number of ways to decode it.Input: “12”Output: 2Expl原创 2020-07-25 22:04:39 · 91 阅读 · 0 评论 -
最小台阶问题
题目有一个楼梯,每层楼梯都有一个走过要花费的钱,一旦交过楼梯费,可以一个走一个或两个台阶,求走完楼梯最小花费值,可以从第0个或者第一个台阶出发。思路creat一个数组,每个位置记录下走到当前的最小花费代码def lesscost(list1): dp = [0]*len(list1) dp[0] = list1[0] dp[1] = list1[1] for i in range(2,len(list1)): dp[i] = min(dp[i-1],dp[i-2]) + l原创 2020-07-25 20:08:23 · 106 阅读 · 0 评论 -
铺瓷砖
题目一个2n的路,给无数个21的瓷砖,问有多少种铺法。思路def road_tile(n): dp = [0]*(n+1) dp[0] = 1 dp[1] = 1 for i in range(2,n+1): dp[i] = dp[i-1]+dp[i-2] return dp[n]原创 2020-07-25 19:51:53 · 77 阅读 · 0 评论 -
入室抢劫2
题目如果房子是原型的,那么抢了第一个就不能抢最后一个,反之同理。def robber(list0): if len(list0) == 0: return 0 if len(list0) == 1: return list0[0] if len(list0) == 2: return max(list0) else: end = robber_helper(list0[1:]) front = robber_helper(list0[:-1])原创 2020-07-25 18:59:23 · 101 阅读 · 0 评论 -
金币组合
题目给定无数个1,3,4元,组合成5元有多少种组合方式思路1.分治法,递归。2.动态规划。假设我要组合成n元,如果我选择一个1元,则我有dp(n-1)种组合方式。故dp(n)= dp(n-1)+dp(n-3)+dp(n-4)代码class M: num = 0 def money(self,n1,n2,n3,m): if m < 0: return if m == 0: self.num += 1 self.money(n1,n2,原创 2020-07-25 16:13:15 · 143 阅读 · 0 评论 -
入室抢劫1
题目小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。思路creat两个一维数组,记录抢或者不抢的得到的最大金额。代码def robber(list1): dpy = [0]*len(list1) dpn = [0]*len(list1) dpy[0] = list1[原创 2020-07-25 17:33:36 · 150 阅读 · 0 评论