算法 活动选择问题
2014-04-15 00:46
288 查看
参考博客:
http://www.cnblogs.com/Anker/archive/2013/03/16/2963625.html
不过,还是有些问题。。不知道错在哪里了。。
运行的结果如下:
不知道怎么会越界了呢?真奇怪。。
问题找到了
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]
最终的源代码为:
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]输出结果为: