P5017 摆渡车
链接:P5017
-----------------------------------------
看见了动态规划不会怎么办?
搜索,剪枝,记忆化!
(cz就是巨啊)
--------------------------------------------
记忆化搜索,搜索第i个人上车后的下一班车的出发时间
数组的二维是第i个人的等待时间。
---------------------------------------------
Orzcz
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 7 using namespace std; 8 int n,m,t[505],men[505][505]; 9 int solve(int i,int start){//接到了第i个人后 10 if(i==n+1) 11 return 0; 12 if(start<t[i])//没人?就等等人 13 return solve(i,t[i]); 14 if(men[i][start-t[i]]) 15 return men[i][start-t[i]]; 16 int sum=0; 17 int j=i; 18 while(j<=n&&t[j]<=start) 19 sum+=t[j++]; 20 int best =start *(j-i)-sum+solve(j,start+m);//把这班车的出发前的 21 //人都接上,然后计算新添的等待时间和这班车回来后 22 for(;j<=n;++j){ 23 sum+=t[j];//计算如果这班车继续等,然后刚好接走第j+1个人 24 best = min(t[j]*(j-i+1)-sum+solve(j+1,t[j]+m),best); 25 } 26 return men[i][start-t[i]]=best;//返回 27 } 28 int main(){ 29 scanf("%d%d",&n,&m); 30 for(int i=1;i<=n;++i){ 31 scanf("%d",&t[i]); 32 } 33 sort(t+1,t+n+1); 34 printf("%d",solve(1,0)); 35 return 0; 36 }
--------------------------------------------
记忆化搜索,快捷易懂,可以挑战DP