题意:在环形公路上,给定n个工厂制造机器人的花费以及n条道路每个时刻的金币数,一个时刻必须有也只能有一个机器人在公路上收集金币,求m时刻后能收集的最多金币。这题题意很明确,显然是dp,这里我们讲的是贪心的做法,另外还有单调队列的做法。
我们要尽可能多地收集金币,就得考虑第i时刻买不买机器人。所以我们要分清什么情况下买机器人,什么情况下不买机器人。
先介绍一下代码中要用到的数组及变量。
dp[i][j] 表示i时刻在j工厂能收集到的最多金币
step[i][j] 表示在i时刻在j工厂的机器人已经走的步数
pre[i] 表示i工厂前一个工厂编号,当i>1时,pre[i]=i-1;当i=1时,pre[i]=n
mx 表示当前时刻能得到的最多金币
pastmx 表示前一个时刻能得到的最多金币
买机器人的情况:
(1)step[i-1][pre[j]]=p,即表示上个机器人已经走了p步,机器人不能再走了;(2)pastmx-cost[pre[j]]≥dp[i-1][pre[j]],即表示在i-1时刻的某个工厂收集到金币减去j工厂前一个工厂制造的花费仍大于等于i-1时刻到达j工厂前一个工厂收集到的金币数,也就是说pastmx-dp[i-1][pre[j]]足以支付pre[j]的制造费用,此时买机器人能走的步数比之前多,显然更优。
不买机器人的情况:
不买机器人就是除去买机器人的情况,step加1,能获得的金币增加
#include<stdio.h>