dp 多阶段决策:
把起点和终点加入到充电站中去:
dp[i]表示从起点到第i个充电站的最短时间:
dp[i]不能简单的由dp[i-1]得来,而是用j遍历0到i-1,
下面的双重循环,表示从第j个电站处充电,然后一直骑到i电站所需的时间,遍历完0到i-1,求出最小的dp[i];
因为充电的地方必在电站处,并且从0到i的过程中,0与i之间的电站可以选着充电或不充电,为了最优,就需要,j从0到i-1遍历;
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int i,j,k,l,m,n; double dp[1111],t1,t2; double c,t,vr,vt1,vt2; double a[1111]; while(cin>>l) { cin>>n>>c>>t; cin>>vr>>vt1>>vt2; for(i=1;i<=n;i++) { cin>>a[i]; dp[i]=111111111; } dp[0]=0;dp[n+1]=111111111;; a[n+1]=l; a[0]=0; double ans=0; for(i=1;i<=n+1;i++) { for(j=0;j<i;j++) { int len=a[i]-a[j]; t1=0;t2=0; if(c>=len) { t1=len*1.0/vt1; } else { t1=c*1.0/vt1; t2=(double)(len-c)*1.0/vt2; t1+=t2; } if(j>0) t1+=t; t1+=dp[j]; dp[i]=min(dp[i],t1); } } if(dp[n+1]>l*1.0/vr) { cout<<"Good job,rabbit!"<<endl; } else { cout<<"What a pity rabbit!"<<endl; } } return 0; }