【题目类型:动规+双指针】
题目内容
有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])