美文网首页
动态规划 python

动态规划 python

作者: 第六象限 | 来源:发表于2018-08-06 10:45 被阅读0次

    最长公共子串

    
    def find_lcsubstr(s1, s2): 
        m=[[0 for i in range(len(s2)+1)]  for j in range(len(s1)+1)]  #生成0矩阵,为方便后续计算,比字符串长度多了一列
        mmax=0   #最长匹配的长度
        p=0  #最长匹配对应在s1中的最后一位
        for i in range(len(s1)):
            for j in range(len(s2)):
                if s1[i]==s2[j]:
                    m[i+1][j+1]=m[i][j]+1
                    if m[i+1][j+1]>mmax:
                        mmax=m[i+1][j+1]
                        p=i+1
        return s1[p-mmax:p],mmax   #返回最长子串及其长度
     
    print find_lcsubstr('abcdfg','abdfg')
    

    0-1背包

    capacity=10 #背包能容纳的weight
    n=5  #商品种类
    weights=[2,1,3,3,4]
    val=[4,2,6,7,6]
    def knapsack(capacity,n,weights,val):
        dp=[0]*(capacity+1)
        for i in range(1,n+1):
            w,v=weights[i-1],val[i-1]
            for j in range(capacity,0,-1):
                if(j>=w):
                    dp[j]=max(dp[j],dp[j-w]+v)
        return dp[capacity]
    
    print(knapsack(capacity,n,weights,val))
    

    完全背包(物品数量为无限个)

    capacity=10 #背包能容纳的weight
    n=5  #商品种类
    weights=[2,1,3,3,4]
    val=[4,2,6,7,6]
    def knapsack(capacity,n,weights,val):
        dp=[0]*(capacity+1)
         for i in range(0,n):
            w,v=weights[i],val[i]
            for j in range(w,capacity+1):
                dp[j]=max(dp[j],dp[j-w]+v)
        return dp[capacity]
    
    print(knapsack(capacity,n,weights,val))
    

    322.coins change
    有多少种换法

    def DP_Com(exlist,num):
      an=[1]+[0]*num
      for i in exlist :
          for j in range(i,num+1):
              an[j]+=an[j-i]
      return an[num]
    print(DP_Com([1,2,5,10,20,50],100))
    
    

    最少需要几张coin

    class Solution(object):
        def coinChange(self, coins, amount):
            """
            :type coins: List[int]
            :type amount: int
            :rtype: int
            """
            # dp[i]表示amount=i需要的最少coin数
            dp = [0]+[amount+1] * amount
            for i in range(amount+1):
                for c in coins:
                        if c <= i:
                            dp[i] = min(dp[i], dp[i-c]+1)
            return dp[amount] if dp[amount] <= amount else -1
    

    相关文章

      网友评论

          本文标题:动态规划 python

          本文链接:https://www.haomeiwen.com/subject/rgewvftx.html