只需求出乌龟最短耗时跟兔子耗时比即可
将起点 0 和终点 N+1 也看做充电站,进行动态规划
对第i个点进行动态规划,则可以得到状态转移方程为
dp[i] = max{dp[j]+time[i][j]} j∈[0,i]
time[i][j]=max(不充电从i到j耗时 , 在i充满电后再到j耗时)
最后将dp[N+1]与兔子耗时对比
1 /* 2 Written By. StelaYuri 3 */ 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 int main(){ 8 int L,N,C,T,VR,VT1,VT2,p[105],i,j,dis; 9 double time,dp[105]; 10 while(cin>>L>>N>>C>>T>>VR>>VT1>>VT2){ 11 for(i=1;i<=N;i++) 12 cin>>p[i]; 13 p[0]=0; 14 p[N+1]=L; 15 fill(dp,dp+105,1e9); 16 dp[0]=0.0; 17 for(i=1;i<=N+1;i++) 18 for(j=0;j<i;j++){ 19 time=T; 20 dis=p[i]-p[j]; 21 if(!j) 22 time=0.0; 23 if(dis<=C) 24 time+=1.0*dis/VT1; 25 else 26 time+=1.0*C/VT1+1.0*(dis-C)/VT2; 27 dp[i]=min(dp[i],dp[j]+min(time,1.0*dis/VT2)); 28 } 29 if(dp[N+1]<1.0*L/VR) 30 cout<<"What a pity rabbit!\n"; 31 else 32 cout<<"Good job,rabbit!\n"; 33 } 34 35 return 0; 36 }