UVA - 10201 Adventures in Moving - Part IV

来源:互联网 发布:ip反查域名工具 编辑:程序博客网 时间:2024/05/29 14:01

状态转移很明显

遗憾只在poj上通过了。。。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN=110;int main(){    int distance,dp[MAXN][MAXN*2],T,stations,station[MAXN][2];    char input[30];    scanf("%d",&T);    while(T--){        stations=0;        memset(dp,0X7F,MAXN*MAXN*8);        int MAX=dp[0][0],ans=MAX;        scanf("%d",&distance);        getchar();        while(gets(input)&&input[0]!='\0'){            sscanf(input,"%d %d",&station[stations][0],&station[stations][1]);            if(station[stations][0]>distance)                continue;            if(station[stations][0]==station[stations-1][0]&&station[stations][1]>station[stations-1][1])                stations--;            else if(station[stations][0]==station[stations-1][0]&&station[stations][1]<station[stations-1][1]){                stations--;                station[stations][1]=station[stations+1][1];            }            stations++;        }        /*for(int i=0;i<stations;i++)            printf("%d %d\n",station[i][0],station[i][1]);            puts("");        */        if(stations==0){            if(distance>0)                printf("Impossible\n");            else                printf("0\n");            continue;        }        if(station[0][0]>100){            printf("Impossible\n");            continue;        }        for(int i=1;i<stations;i++){            if(station[i][0]-station[i-1][0]>200){                printf("Impossible\n");                goto next;            }        }        if(station[stations-1][0]+100<distance){            printf("Impossible\n");            continue;        }        for(int i=200;i>=0;i--){            if(i<100-station[0][0])                break;            dp[0][i]=(i-100+station[0][0])*station[0][1];        }        for(int i=1;i<stations;i++){            for(int j=200;j>=0;j--){                for(int t=station[i][0]-station[i-1][0];t<=200;t++){                    if((j-(t-station[i][0]+station[i-1][0]))<0)                        break;                    dp[i][j]=min(dp[i][j],dp[i-1][t]+(j-(t-station[i][0]+station[i-1][0]))*station[i][1]);                }            }        }        //printf("%d",ans);        for(int i=0;i<=200;i++){            if(i-(distance-station[stations-1][0])>=100)                ans=min(ans,dp[stations-1][i]);        }        if(ans==MAX)            printf("Impossible\n");        else            printf("%d\n",ans);        next:{}        if(T)printf("\n");    }    return 0;}


0 0