• UVA_1025_A_Spy_in_the_Metro_(动态规划)


    描述


     

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3466

    某城市的地铁是线性的,有n个车站,有M1辆列车从左到右开,M2辆列车从右到左开.在0时刻,你在第一站,要在T时刻到达第n站,其间可以随意换车,要求在车站等待的时间最短.

    分析


    用dp[i][j]表示在i时刻,在第j站,要达到目的,需要等待多久.显然dp[T][n]=0,对于任意i!=n,dp[T][i]=INF,要求dp[0][1].那么转移方程:

    dp[i][j]=1.dp[i+1][j]+1(在车站等一分钟).

       2.dp[i+t[j]][j+1](如果有,乘坐向右的列车).

       3.dp[i+t[j-1]][j-1](如果有,乘坐向左的列车).

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=50+5,maxt=200+5,INF=0x3fffffff;
     5 int n,T,M1,M2,kase;
     6 int t[maxn],dp[maxt][maxn];
     7 bool has_train[maxt][maxn][2];
     8 
     9 void solve(){
    10     for(int i=1;i<=n;i++) dp[T][i]=INF;
    11     dp[T][n]=0;
    12     for(int i=T-1;i>=0;i--)
    13         for(int j=1;j<=n;j++){
    14             dp[i][j]=dp[i+1][j]+1;
    15             if(j<n&&has_train[i][j][0]&&i+t[j]<=T)
    16                 dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]);
    17             if(j>1&&has_train[i][j][1]&&i+t[j-1]<=T)
    18                 dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]);
    19         }
    20     printf("Case Number %d: ",++kase);
    21     if(dp[0][1]>=INF) puts("impossible");
    22     else printf("%d
    ",dp[0][1]);
    23 }
    24 void init(){
    25     scanf("%d",&T);
    26     for(int i=1;i<n;i++){
    27         scanf("%d",&t[i]);
    28     }
    29     memset(has_train,0,sizeof has_train);
    30     scanf("%d",&M1);
    31     for(int i=1;i<=M1;i++){
    32         int d; scanf("%d",&d);
    33         int station=1;
    34         while(d<=T&&station<n){
    35             has_train[d][station][0]=true;
    36             d+=t[station++];
    37         }
    38     }
    39     scanf("%d",&M2);
    40     for(int i=1;i<=M2;i++){
    41         int d; scanf("%d",&d);
    42         int station=n;
    43         while(d<=T&&station>0){
    44             has_train[d][station][1]=true;
    45             d+=t[station-1]; station--;
    46         }
    47     }
    48 }
    49 int main(){
    50     while(scanf("%d",&n)&&n){
    51         init();
    52         solve();
    53     }
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    uniapp 小程序分享功能
    uniapp 输入有值后按钮变色
    css 跑马灯
    uniapp 复选框问题
    【Python】where cut query melt函数用法
    【Python】Pivot_table透视表用法及CategoricalDtype自定义排序
    【Python】Merge函数的用法
    【Python】extract及contains方法(正则提取筛选数据)
    Promise
    CSS垂直居中的方法
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5526548.html
Copyright © 2020-2023  润新知