T2:
5770. 【2018提高组模拟A组8.6】可爱精灵宝贝
题目描述
Branimirko是一个对可爱精灵宝贝十分痴迷的玩家。最近,他闲得没事组织了一场捉精灵的游戏。游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n。
刚开始玩家在k号房子前。有m个精灵,第i只精灵在第A[i]栋房子前,分值是B[i],以及它在T[i]秒内(含)存在,之后消失。Branimirko可以选择移动至相邻的房子,耗时1秒。抓住精灵不需要时间,精灵被抓住后消失。时间从第1秒开始。Branimirko能最多获得多少分值和。
输入
输入的第1行为三个正整数n,k,m。
接下来m行描述精灵的信息,分别为A[i],B[i],T[i]。
输出
输出Branimirko能最多获得多少分值和。
样例输入
10 5 4
1 30 4
3 5 7
7 10 12
9 100 23
样例输出
115
【数据范围】
20%的数据:m≤10
40%的数据:m≤20
k≤n≤1000,m≤100,A[i] ≤N,B[i] ≤100,T[i] ≤2000,所有数为正整数。
题解:我们发现Branimirko会先往一个方向走,走到某个地方后往回走,每次向左走会走到上一次原来的左端点的左边,向右走会走到原来右端点的右边,因为左右端点间的精灵不是消失了就是被抓了,所以不会为了走到左右端点间停下。
设f[i,j,k]表示走了i到j,花了k的时间的最大收益。i<j表示当前在节点i否则在节点j。
记忆化宽搜,因为每次向左走会走到min(i,j)-1,向右走会走到max(i,j)+1
即向左走会走到左端点左一个,向右走会走到右端点右一个。
判断一下走到新节点的时间是否小于其消失时间,可以就加上它的分值并比较,否则直接将当前状态与其比较,更优就更新,并把其加入队列,答案为所有状态的分数最大值。