UVA 10201-Adventures in Moving – Part4(DP)

来源:互联网 发布:淘宝收不到自己的店铺 编辑:程序博客网 时间:2024/06/08 16:03

题目大意:有一辆卡车每一公里耗油1升,油箱上限200升,初始时有100升油,现在中间有若干个加油站,每个加油站离初始点有一定的距离并且每个加油站都有自己的每升油价,可以选择一些加油,跑完全程以后车至少要剩100升油。问最小的花费。


用d[i][j]表示到达第i个加油站并且加油(也许不加油)过后,到达j升油最小的花费。a[i].loc和a[i].pri表示加油站的坐标和价格。

分两种情况,若在这个加油站至少加一升,那么由d[i][j-1]+a[i].pri推来,若在这个加油站不加油,那么由d[i-1][j+a[i].loc-a[i-1].loc]推来。


状态转移方程:d[i][j]=max {d[i][j-1]+a[i].pri,d[i-1][j+a[i].loc-a[i-1].loc] }


#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct{int loc;int pri;}Sta;Sta a[110];int d[110][210];char e[310];int main(void){int i,j,u,v,p,pi,qi,top,lo,minp,OK;scanf("%d",&pi);for(qi=1;qi<=pi;qi++){scanf("%d",&p);while(getchar()==' '){;}top=0;while((gets(e+1)!=NULL)&&(strcmp(e+1,"")!=0)){lo=strlen(e+1);i=1;while((e[i]>'9')||(e[i]<'0')){i++;}u=0;while((e[i]>='0')&&(e[i]<='9')){u=u*10+e[i]-'0';i++;}while((e[i]>'9')||(e[i]<'0')){i++;}v=0;while((e[i]>='0')&&(e[i]<='9')&&(i<=lo)){v=v*10+e[i]-'0';i++;}if((top==0)||(u!=a[top-1].loc)){top++;a[top].loc=u;a[top].pri=v;}else if((u==a[top].loc)&&(v<a[top].pri)){a[top].pri=v;}}if(((top==0)&&(p!=0))||(a[1].loc>100)||(p-a[top].loc>100)){printf("Impossible\n");}else if((top==0)&&(p==0)){printf("0\n");}else{for(j=0;j<=100-a[1].loc;j++){d[1][j]=0;}for(j=100-a[1].loc+1;j<=200;j++){d[1][j]=d[1][j-1]+a[1].pri;}OK=1;for(i=2;i<=top;i++){if(a[i].loc-a[i-1].loc>200){OK=0;break;}d[i][0]=d[i-1][a[i].loc-a[i-1].loc];for(j=1;j<=200;j++){minp=d[i][j-1]+a[i].pri;if((j+a[i].loc-a[i-1].loc<=200)&&(d[i-1][j+a[i].loc-a[i-1].loc]<minp)){minp=d[i-1][j+a[i].loc-a[i-1].loc];}d[i][j]=minp;}}if(OK==0){printf("Impossible\n");}else{printf("%d\n",d[top][100+p-a[top].loc]);}}if(qi!=pi){printf("\n");}}return 0;}


0 0