您的位置:首页 > 编程语言 > Python开发

python rmq

2015-10-09 01:20 441 查看
import math

def init( arr ):
arr_len = len( arr )
exp = int( math.log( arr_len, 2 ) )
DP = [ [ 0 for col in range( exp + 1 ) ] for row in range( arr_len + 1 ) ]
for index, item in enumerate( arr ):
DP[index + 1][0] = item
for e in range( 1, exp + 1 ):
for start in range( 1, arr_len + 1 ):
if start + ( 1 << e ) - 1 > arr_len:
break
DP[start][e] = max( DP[start][e - 1], DP[start + ( 1 << ( e - 1 ) )][e - 1] )
return DP

def ask( DP, left, right ):
cut = int( math.log( right - left + 1, 2 ) )
return max( DP[left][cut], DP[right + 1 - ( 1 << cut )][cut] )

DP = init( [ 3, 4, 1, 6, 7, 2, 10 ] )

print( ask( DP, 1, 1 ) )
print( ask( DP, 1, 2 ) )
print( ask( DP, 1, 7 ) )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: