zoukankan      html  css  js  c++  java
  • 动态规划刷题集python代码

    1 爬楼梯(Fibonacci)

    #有一楼梯共M级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
    def fun(m):
        c = [0]*m
        c[0] = 1
        c[1] = 2
        for i in range(2,m):
            c[i] = c[i-1]+c[i-2]
        return c[m-1]
    print(fun(3))

    2最长公共子序列长度

    def lcs(x,y,m,n):
        c = [[0]*(n+1)]*(m+1)
        print(len(c),len(c[0]))
        for i in range(m):
            for j in range(n):
                if x[i]==y[j]:
                    c[i+1][j+1]=c[i][j]+1
                else:
                    c[i+1][j+1]=max(c[i+1][j],c[i][j+1])
        return c[m][n]
    x = [1,3,2,5,6]
    y = [6,3,2,4,5,7,6]
    m,n = 5,7
    print(lcs(x,y,m,n))

      变形有最短编辑距离

    3 最长上升子序列长度

    def lis(x,m):
        if m == 0:
            return 0
        c = [1]*m #c[i]为以i下标为结尾的最长上升子序列长度,如果m不为0,那么结果至少为1
        for i in range(m):
            for j in range(i):
                if x[i]>x[j]:
                    c[i] = max(c[j]+1,c[i]) 
        return max(c)
    x = [2,1,5,7,10,4]
    m = 6
    print(lis(x,m))

    4 硬币找零之最少硬币方案

    def coinfun(coin,aim):
        max_value = aim+1
        c = [0]+[max_value]*aim
        #两行写法,很python
        # for i in range(1,aim+1):
        #     c[i] = min([c[i-j] if i-j>=0 else max_value for j in coin ])+1
        #常规写法
        for i in range(1,aim+1):
            for j in coin:
                if i-j>=0:
                    c[i] = min(c[i],c[i-j]+1)
        if c[aim] == aim+1:
            return -1 #没法找
        return c[aim]
    coin = [5,2,3]
    aim = 20
    print(coinfun(coin,aim))

    5 硬币找零之最大找零种数

    def coinfun(coin,aim):
        c = [0]*(aim+1)
        c[0]=1
        for j in coin:
            for i in range(1,aim+1):
                if i-j>=0:
                    c[i] += c[i-j]
        if c[aim] == 0:
            return -1 #没法找
        return c[aim]
    coin = [5,2,3]
    aim = 20
    print(coinfun(coin,aim))

    6 最大连续子序列和

    #最大连续子序列和
    def maxsub(A): dp = [0] *len(A) #以i下表为结尾的最大连续子序列和(大概这个意思,不太准确明白就行) dp[0] = A[0] for i,item in enumerate(A): dp[i] = item+dp[i-1] if dp[i-1]>0 else item return max(dp) A = [3,-1,5,-7,4] print(maxsub(A))

    7 不相邻元素最大累加和

    #最大不相邻累加和
    def sum1(arr):
        c = [0]*len(arr)
        c[0] = arr[0]
        c[1] = max(arr[0],arr[1])
        for i in range(2,len(arr)):
            c[i] = max(c[i-1],c[i-2]+arr[i])
        return c[-1]
    arr = [3, 2, 1, 9, 4, 2]
    print(sum1(arr))
  • 相关阅读:
    UVA 10692
    XCODE插件 之 Code Pilot 无鼠标化
    VC版超级记事本
    抓包函数-pcap_next
    通过PowerShell卸载全部的SharePoint 2010 解决方式
    typedef和#define的差别——————【Badboy】
    一个简单演示样例来演示用PHP訪问表单变量
    怎样隐藏Windows7 系统保留分区
    2016 360笔试题------找第一个仅仅出现一次的字符
    Eclipse中Easy Shell插件配置PowerCmd
  • 原文地址:https://www.cnblogs.com/dylan9/p/8944701.html
Copyright © 2011-2022 走看看