hdu 2059

ps:终于解决了。。。。卡了我好久。最后用了DP。然后还有记忆化搜索优化了一下。终于AC了

思路:要计算dp[n](就是到第n个站的最短时间,也就是最优方案),必须知道dp[0]到dp[n-1]

设j是上一个站的充电,j从0开始循环,找出最优充电站,一直循环到n-1.然后取这里面的最小值.

代码:

#include "stdio.h"
#include "string.h"
int L,N,C,T,VR,VT1,VT2;
int p[110];
double dd[110];
double dp(int n){
    int i;
    if(n==0) return 0.0;
    if(dd[n]>0.0) return dd[n];
    int len;
    double time,min;
    min=100000000.0;
    for(i=0;i<n;i++){
        len=p[n]-p[i];
        if(len>=C){
            time=(double)(len-C)/VT2+(double)C/VT1;
        }
        else{
            time=(double)len/VT1;
        }
        if(i) time+=T;
        if(dp(i)+time<min){
            min=dp(i)+time;
        }
    }
    return dd[i]=min;
}
int main(){
    int i;
    double time2;
    while(~scanf("%d",&L)){
        scanf("%d%d%d",&N,&C,&T);
        scanf("%d%d%d",&VR,&VT1,&VT2);
        memset(dd,-1,sizeof(dd));
        for(i=1;i<=N;i++){
            scanf("%d",&p[i]);
        }
        p[0]=0;
        p[N+1]=L;
        time2=(double )L/VR;
        if(dp(N+1)>time2*1.0) printf("Good job,rabbit!\n");
        else printf("What a pity rabbit!\n");
    }
    return 0;
}

 

你可能感兴趣的:(hdu 2059)