算法 活动选择问题

参考博客:

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]
输出结果为:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值