• python实现算法: 多边形游戏 数塔问题 01背包问题 快速排序


    去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦!


    1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值, 每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。 游戏第1步,将一条边删除。 随后n-1步按以下方式操作: (1)选择一条边E以及由E连接着的2个顶点V1和V2; (2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点。 最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。  问题:对于给定的多边形,计算最高得分。
    #! /usr/bin/env python
    #coding=utf-8
    import time
    ''''''
    v = [-7,4,2,5]
    op = ['+','*','*','+']
    
    def m(a,b):
      if b==1:
        return v[a]
    
      max = float('-inf')
      for i in range( 1,b ):
        if op[ (a+i-1)%4 ]=='+':
          temp =  m( a%4,i ) + m( (a+i)%4, b-i )
        elif op[ (a+i-1)%4 ]=='*':
          temp = m(a % 4, i) * m((a + i) % 4, b - i)
        if max<temp:
          max,temp = temp,max
    
      return max
    
    for i in range(4):
      for j in range(1,5):
        print m(i,j),
      print '\n'
    time.sleep(100)

    2.数塔问题-动态规划

    设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示:

    要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。

     

    #! /usr/bin/env python
    #coding=utf-8
    
    v = [9,12,15,10,6,8,2,18,9,5,19,7,10,4,16]
    
    def m(a,b):
      '''
      本程序会重复计算一些m值
      优化方法:将计算后的m存到一个字典里
      '''
      if a == 4:
        return v[b]
    
      else:
        L = m(a+1,a+b+1)
        R = m(a+1,a+b+2)
        if L > R:
          return L + v[b]
        else:
          return R + v[b]
    
    if __name__ == '__main__':
      print m(0,0)

     3.0-1背包问题-动态规划

    背包问题(Knapsack problem)是一种组合优化的NP完全问题。
    问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,
    在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
    #! /usr/bin/env python
    #coding=utf-8
    import time
    ''''''
    w = [2,1,3,2]#重量
    v = [12,10,20,15]#价值
    def m(i,j):
      '''
      形参i:背包中已有物品0 1 ··· i
      形参j:背包剩余容量
      返回值:当前最优值
      '''
      if i==-1 or j==0:
        return 0
      else:
        if j>=w[i]:
          m1 = m(i-1,j)#能装但不装
          m2 = m(i-1,j-w[i])+v[i]#
          if m1>m2:
            return m1
          else:
            return m2
        else:
          return m(i-1,j)#不能装
    
    print m(3,5)

     4.快速排序-分治法

    时间复杂度

    最好:O(nlogn)  最坏:O(n^2)  平均:1.38nlogn

    #! /usr/bin/env python
    #coding=utf-8
    import random
    
    def A(a,b):
      if a==b:
        return
      elif 1 == (b-a):
        if list[a]>list[b]:
          list[a],list[b] = list[b],list[a]
        return
      else:
        i = a+1
        j = b
        while i < j:
          while i<b and list[i] <= list[a]:
            i+=1
          while j>a+1 and list[j]>=list[a]:
            j-=1
          list[i],list[j] = list[j],list[i]
        if i==j==a+1 :
          A(a+1,b)
        elif i==j == b:
          list[a],list[j] = list[j],list[a]
          A(a,b-1)
        else:
          list[i],list[j] = list[j],list[i]
          list[a],list[j] = list[j],list[a]
          A(a,j-1)
          A(j+1,b)
    
    
    list = [95, 63, 38, 96, 80, 5, 43, 57]
    A(0,7)
    print list

    说明:源码纯属原创(写了半个下午),学术用途转载请注明出处,商业用途请先与我联系

    参考:算法导论课件

  • 相关阅读:
    01
    py5.30
    py 5.28
    py5.25
    py 5.24
    py 5.22
    py5.21
    py 5.18
    py 5.17
    py 5.16
  • 原文地址:https://www.cnblogs.com/woxinfeixiang2015/p/5356855.html
Copyright © 2020-2023  润新知