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 |
|