开始觉得自己的数学要好好复习一下了

做为一名IT工作者,有些人觉得我不是班科出生,以前我也觉得如果是计算机系的可能要好些,但现在我觉得对于数学系(纯数学)的我,可能也有很大的优势,不在什么地方,就在算法实现上的不同,可能完全不是量级的变化,而是思考方式的变化,一个全排列的问题用矩阵去思想,却变得如此高效,真让我要好好反思,好好复习一些曾经学得很好的数分高代。

把n个数字, 放到 [][][]…[] * []…[], 令结果最大,乘号左边为n个数字中的若干个

还算高效的算法

def  calc(seq, where): 
  maximum, max_item 
=  0, [] 
  
for  i  in  seq: 
    product 
=  int(i[:where])  *  int(i[where:]) 
    
if  product  >  maximum: 
       maximum, max_item 
=  product, i 
    
elif  product  ==  maximum: 
       max_item 
+=   ' , ' +  i 
  
print   " Maximum at " , max_item,  " ,product " , maximum 
  
def  permute(seq): 
  l 
=  len(seq) 
  
if  l  <=   2
    
if  l  ==   2
      
return  [ seq, [seq[ 1 ], seq[0]] ] 
    
else
      
return  [seq] 
  
else
    res
= [] 
    
for  i  in  range(len(seq)): 
      rest 
=  seq[:i]  +  seq[i + 1 :] 
      
for  x  in  permute(rest): 
        res.append(seq[i:i
+ 1 +  x) 
    
return  res 
  
import  sys 
seq 
=  list(sys.argv[ 1 ]) 
where 
=  int(sys.argv[ 2 ]) 
thelist 
=  [  '' .join(x)  for  x  in  permute(seq) ] 
print   ' Got ' , len(thelist),  ' items. '  
calc(thelist, where)

看看用矩阵的思维做的

def  solve(seq,where): 
  n 
=  len(seq) 
  seq.sort() 
  seq.reverse() 
  table 
=  [ []  for  i  in  range(n) ] 
  left, right 
=  where, n  -  where 
  leftr 
=  long( ' 1 ' * left) 
  rightr 
=  long( ' 1 ' * right) 
  flag
= [] 
  
for  item  in  [ int(x)  for  x  in  seq]: 
    
for  i  in  range(left): 
      table[left
- i - 1 =  (leftr  +   10 ** i)  *  rightr 
    
for  i  in  range(right): 
      table[right
- i + where - 1 =  leftr  *  (rightr  +   10 ** i) 
    
for  i  in  flag: 
      table[i] 
=  0 
    tablesorted 
=  table[:] 
    tablesorted.sort() 
    maxindex 
=  table.index(tablesorted[ - 1 ]) 
    
if  maxindex  >=  where: 
       rightr 
=  rightr  +  (item - 1 *   10 ** (right - maxindex + where - 1
    
else
       leftr 
=  leftr  +  (item - 1 *   10 ** (left - maxindex - 1
    flag.append(maxindex) 
    
# print maxindex, leftr, rightr 
   return  leftr, rightr 
  
import  sys 
leftr, rightr 
=  solve(list(sys.argv[ 1 ]),int(sys.argv[ 2 ])) 
print   " Maximum at " , leftr,rightr,  ' ,product ' , leftr * rightr

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值