算法笔试-编程练习-好题-05

【题目类型:动规+双指针】

题目内容

有N个基站采用链式组网,按照从左到右编码为1到N编号。

已知定义“业务”概念为三元组(基站起始编号,基站结束编号,利润),意味着需要占据基站起始编号到基站结束

编号的所有基站,打通信号流,可以获得对应利润。

现在外部存在多个“业务"需求待接纳,但基站使用具有排他性,也就是说一旦某一个业务占据某个基站,其他

业务不可以再使用此基站。

那么接纳哪些业务需求,可以使得利润最大化?

输入描述

第一行,输入N,表示有N个基站。NN取值范围[1,10000]

第二行,输入M,表示有M组业务。,M取值范围[1,100000]

接下来M行:每行输入三个整数K1K2 R,以空格隔开,表示起始基站编号,结束基站编号,利润。K1,K2<N,K1<K2,R取值范围[1,100]

输出描述

输出只有一个整数,表示获取的利润

样例1

输入

5
2
1 5 4
2 4 8

输出

8

题目分析

【题目类型:动态规划+双指针】

我们以业务的结束基站来描述业务的利润,那么基站i处如果没有业务,则其最大利润为:DP[i]=DP[i-1],若有任务则为DP[i]=max(DP[i-1], DP[k1-1]+r)

代码如下:

n = int(input())
m = int(input())

yewu = {}
for _ in range(m):
    K1, K2, R = map(int, input().split())
    if K2 not in yewu.keys():
        yewu[K2] = [(K1, R)]
    else:
        yewu[K2].append((K1, R))

DP = [0]*(n+1)
K2s = sorted(list(yewu.keys()))
for i in range(1, n+1):
    DP[i] = DP[i-1]
    if len(K2s) > 0 and i == K2s[0]:
        K2s.pop(0)
        for k1, r in yewu[i]:
            if DP[i] < DP[k1-1] + r:
                DP[i] = DP[k1-1] + r

print(DP[-1])

你可能感兴趣的:(大厂校招-编程集训,算法,动态规划,双指针)