您的位置:首页 > 其它

算法 活动选择问题

2014-04-15 00:46 211 查看
参考博客:
http://www.cnblogs.com/Anker/archive/2013/03/16/2963625.html
#encoding=utf-8
import sys
def greedy_activity(activity,begin,end):
activity_list=[]
activity_list.append(begin)
temp_end_time=activity[begin][1]#获取最小的结束时间
if begin==end:
return activity_list
for index in xrange(begin,end+1):
if activity[index][0]>temp_end_time:
activity_list.append(index)
temp_end_time=activity[index][1]
return activity_list
def greedy_act(activity):
return greedy_activity(activity,0,len(activity)-2)
def dynamic_activity_selector(activity,count_list,best_res):
numofactivity=len(activity)
for start in xrange(0,numofactivity-1):
for end in xrange(start+1,numofactivity):
for tempindex in xrange(start+1,end+1):
if activity[tempindex][0]>=activity[start][1] and activity[tempindex][1]<=activity[end][0]:
print start,end,tempindex
tempcount=count_list[start][tempindex]+count_list[tempindex+1][end]+1
if tempcount>count_list[start][end]:
count_list[start][end]=tempcount
best_res[start][end].append(tempindex)

if __name__=="__main__":
timestart = [-1,1,3,0,5,3,5,6,8,8,2,12,sys.maxint]
timefinal= [-1,4,5,6,7,8,9,10,11,12,13,14,sys.maxint]
num=len(timefinal)
timeactivity=[ (timestart[index],timefinal[index]) for index in xrange(num) ]
timeactivity.sort( key=lambda x:x[1])
count_list=[[ 0 for col in xrange(num)] for row in xrange(num) ]
best_res=[[ [] for col in xrange(num)] for row in xrange(num) ]
#ac_list=greedy_act(timeactivity)
dynamic_activity_selector(timeactivity,count_list,best_res)
#print ac_list
print best_res[0][num-2]


不过,还是有些问题。。不知道错在哪里了。。

运行的结果如下:



不知道怎么会越界了呢?真奇怪。。

问题找到了

tempindex的范围是[0,12]

当tempindex=12的时候,count_list[tempindex+1][end]指向的是count_list[13][12]所以越界了。但是怎么解决呢。。

解决的办法:我就把tempindex的范围限定为(start+1,min(end+1,numofactivity-1));

所以就没有报越界错误了,但是,还有一个问题就是

我在输出

print best_res[0][num-2]

得到的结果是 [1,4,8]而不是[1,4,8,11]这怎么办呢?这个该怎么解决呢?哦,知道了

不是输出 best_res[0][num-2]而是best_res[0][num-1]

如果想求[begin,end]的的最大活动的话,

那么调用 best_res[begin-1,end+1]

最终的源代码为:

#encoding=utf-8
import sys
def greedy_activity(activity,begin,end):
activity_list=[]
activity_list.append(begin)
temp_end_time=activity[begin][1]#获取最小的结束时间
if begin==end:
return activity_list
for index in xrange(begin,end+1):
if activity[index][0]>temp_end_time:
activity_list.append(index)
temp_end_time=activity[index][1]
return activity_list
def greedy_act(activity):
return greedy_activity(activity,0,len(activity)-2)
def dynamic_activity_selector(activity,count_list,best_res):
numofactivity=len(activity)
for start in xrange(0,numofactivity-1):
for end in xrange(start+1,numofactivity):
for tempindex in xrange(start+1,min(end+1,numofactivity-1)):
if activity[tempindex][0]>=activity[start][1] and activity[tempindex][1]<=activity[end][0]:
#print start,end,tempindex
tempcount=count_list[start][tempindex]+count_list[tempindex+1][end]+1
if tempcount>count_list[start][end]:
count_list[start][end]=tempcount
best_res[start][end].append(tempindex)
if __name__=="__main__":
timestart = [-1,1,3,0,5,3,5,6,8,8,2,12,sys.maxint]
timefinal= [-1,4,5,6,7,8,9,10,11,12,13,14,sys.maxint]
num=len(timefinal)
timeactivity=[ (timestart[index],timefinal[index]) for index in xrange(num) ]
timeactivity.sort( key=lambda x:x[1])
count_list=[[ 0 for col in xrange(num)] for row in xrange(num) ]
best_res=[[ [] for col in xrange(num)] for row in xrange(num) ]
#ac_list=greedy_act(timeactivity)
dynamic_activity_selector(timeactivity,count_list,best_res)
#print ac_list
print best_res[0][num-1]
输出结果为:

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