acwing-341. 最优贸易
考点
- 最短路
- 后效性处理
题解
见思路
思路
某一条路径上选p
和q
两个点,p
在前q
在后,p
买q
卖,求最大值。
双向SPFA
很朴素的思路,枚举每个点x
作为所有经过它的路径的中点。
正向SPFA从1
出发,求到达x
的最小点,记为mi[x]
;逆向SPFA从n
出发,求达到x
的最大点,记为mx[x]
;
最后找出mx[x] - mi[x]
的最大值即可。
之所以不能用dijkstra
,是因为找最小、最大点是有后效性,不满足贪心策略的:
比如有5 -> 6
,6 -> 7
,7 -> 5
三条边,假设有mi[5] = 10
,然后mi[6] = 5
,接着mi[7] = 3
,最后mi[5] = 3
,5
节点完全不可能只出队一次。
1 |
|
分层图+SPFA
也可以用dp的思路,设D[x, j]
代表从1
点0
层出发,到达x
点j
层的最大值,有如下转移方程:
D[y, j] = max(D[y, j], D[x, j])
,同一层边权均为0D[x, j + 1] = max(D[x, j + 1], D[x, j] - a[x])
,第0层向第1层转移时,必须先买入商品,边权均为负D[x, j + 1] = max(D[x, j + 1], D[x, j] + a[x])
,第1层向第2层转移时,必须卖掉商品赚钱,边权均为正
所以直接对下图用SPFA求最大路,最后输出D[n, 2]
即可

1 |
|