Timus 1031
令res[i]表示到达第i个站点所用的最小费用;状态转移方程如下:
res[i]=min{res[k]+f(L1,L2,L3)};(1<=k<i)
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
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;
}