P5017 摆渡车

链接:P5017

-----------------------------------------

看见了动态规划不会怎么办?

搜索,剪枝,记忆化!

cz就是巨啊)

--------------------------------------------

记忆化搜索,搜索第i个人上车后的下一班车的出发时间

数组的二维是第i个人的等待时间。

---------------------------------------------

 

Orzcz

 

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

--------------------------------------------

记忆化搜索,快捷易懂,可以挑战DP

posted @ 2019-07-30 10:24  Simex  阅读(264)  评论(0编辑  收藏  举报