去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦!
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
说明:源码纯属原创(写了半个下午),学术用途转载请注明出处,商业用途请先与我联系
参考:算法导论课件