HDU2059
dp,题意自己看,不再赘述
把起点和终点和起点也看做加油站,则用dp数组来记录到每个加油站的最短时间
dp[i]=min(dp[j]+t,dp[i]) 0<=j<i
即到达第i个加油站的最短时间是由前i个加油站直接到第i个加油站中最短的时间,t表示从第j个加油站途中不加油到第i个加油站的时间
#include <iostream> #define INF 999999 using namespace std; double dp[105]; int main() { int L; int dis[105]; while(cin>>L) { int n,c,t; cin>>n>>c>>t; int vr,vt1,vt2; cin>>vr>>vt1>>vt2; for(int i=1;i<=n;i++) cin>>dis[i]; dis[0]=0; dis[n+1]=L; double tem; for(int i=1;i<105;i++)//初始化要到位!!由于<100WA了两发 dp[i]=INF; dp[0]=0; for(int i=1;i<=n+1;i++) { for(int j=0;j<i;j++) { int len=dis[i]-dis[j]; if(len<=c) tem=len*1.0/vt1; else tem=(len-c)*1.0/vt2+c*1.0/vt1; if(j!=0) tem+=t; dp[i]=min(dp[j]+tem,dp[i]); } } double tt=L*1.0/vr; if(dp[n+1]>tt) printf("Good job,rabbit!\n"); else printf("What a pity rabbit!\n"); } return 0; }