P5017 摆渡车
题目传送门
思路:
- 对于每一个人他的最长等待时间为m-1。车刚走,他下分钟到。
- f[i][j]表示第i个人等j分钟的所有人的最小等待时间(最优解)。注意:第i个人等0分钟(他来就开车),不一定是最优的。
- 深搜第i人在开车时间为st时得最优解,把它的值赋给f[i][st-a[i]]; (记忆化)
- 第i个人在开车时间为st时,这班车上(车)的人总等待时间=st*(j-i)-sum;sum为上车的人到达时间和。然后再加上第j个人,开车时间为(st+m)的最优值(dfs(j,st+m),我们就初步得到一个最优解(不一定是最优的)
- 接下来对于best,我们还需更新最优值;(如果 第i个人后还有人没上车,那么以st为开车时间不一定是最优的)这里我给出一种情况,大家就比较好理解了。只有2个人,第一个1分钟时到,第二个人2分钟到,m=10,st=1并不是最优的。
要想不超时,记忆化+剪枝是法宝!
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=