令res[i]表示到达第i个站点所用的最小费用;状态转移方程如下:
res[i]=min{res[k]+f(L1,L2,L3)};(1<=k<i)
代码如下:
#include#include #include using namespace std; #define MAX 1234567890 int res[10001],dist[10001],L1,L2,L3,C1,C2,C3; int min(int a,int b) { return a < b ? a : b; } int work(int start,int end) { int i,j,w; for(i=start+1;i<=end;i++) { res[i]=MAX; for(j=i-1;j>=start;j--) { w=dist[i]-dist[j]; if(w>L3) break; if(w<=L1) res[i]=min(res[i],res[j]+C1); if(w<=L2) res[i]=min(res[i],res[j]+C2); if(w<=L3) res[i]=min(res[i],res[j]+C3); } } return res[end]; } int main() { int i,n,start,end,temp; while(scanf("%d %d %d %d %d %d",&L1,&L2,&L3,&C1,&C2,&C3)!=EOF) { scanf("%d %d %d",&n,&start,&end); if(start > end) temp=start,start=end,end=temp; for(i=2;i<=n;i++) scanf("%d",&dist[i]); printf("%d\n",work(start,end)); } return 0; }