UVa1025

来源:互联网 发布:华彩人生一点通 mac 编辑:程序博客网 时间:2024/05/16 06:06

UVa1025

红书上的例题9-1,影响决策的只有当前的时间以及所在的站,所以用d(i,j)表示i时刻在j站。然后就是无非两种选择,一种是等一分钟,或是有车的话, 乘车到最近的一站。精妙之处在于has_train的三位数组。还有就是,时间是单向流逝的,是个天然的序。

代码

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int INF=0x3f3f3f3f;int kase=0;int main(){    int n;    while(scanf("%d",&n)&&n!=0)    {        int T,M1,M2,time[n+1];        scanf("%d",&T);        int dp[T+1][n+1];        int has_train[T+100][n+1][2];        memset(has_train,0,sizeof(has_train));        memset(time,0,sizeof(time));        memset(dp,0,sizeof(dp));        for(int i=1; i<n; i++)            scanf("%d",&time[i]);        scanf("%d",&M1);        for(int i=0; i<M1; i++)        {            int a;            scanf("%d",&a);            int k=a;            for(int j=1; j<=n; j++)            {                has_train[k][j][0]=1;                k+=time[j];            }        }        scanf("%d",&M2);        for(int i=0; i<M2; i++)        {            int a;            scanf("%d",&a);            int k=a;            for(int j=n; j>=1; j--)            {                has_train[k][j][1]=1;                k+=time[j-1];            }        }        for(int i=1; i<=n-1; i++) dp[T][i]=INF;        dp[T][n]=0;        for(int i=T-1; i>=0; i--)            for(int j=1; j<=n; j++)            {                dp[i][j]=dp[i+1][j]+1;                if(j<n&&has_train[i][j][0]&&i+time[j]<=T)                    dp[i][j]=min(dp[i][j],dp[i+time[j]][j+1]);                if(j>1&&has_train[i][j][1]&&i+time[j-1]<=T)                    dp[i][j]=min(dp[i][j],dp[i+time[j-1]][j-1]);            }        cout<<"Case Number "<<++kase<<": ";        if(dp[0][1]>=INF) cout<<"impossible\n";        else cout<<dp[0][1]<<"\n";    }    return 0;}
1 0