http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35913

Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After
several thrilling events we find her in the first station of Algorithms City Metro, examining the time
table. The Algorithms City Metro consists of a single line with trains running both ways, so its time
table is not complicated.
Maria has an appointment with a local spy at the last station of Algorithms City Metro. Maria
knows that a powerful organization is after her. She also knows that while waiting at a station, she is
at great risk of being caught. To hide in a running train is much safer, so she decides to stay in running
trains as much as possible, even if this means traveling backward and forward. Maria needs to know
a schedule with minimal waiting time at the stations that gets her to the last station in time for her
appointment. You must write a program that finds the total waiting time in a best schedule for Maria.
The Algorithms City Metro system has N stations, consecutively numbered from 1 to N. Trains
move in both directions: from the first station to the last station and from the last station back to the
first station. The time required for a train to travel between two consecutive stations is fixed since all
trains move at the same speed. Trains make a very short stop at each station, which you can ignore
for simplicity. Since she is a very fast agent, Maria can always change trains at a station even if the
trains involved stop in that station at the same time.
Input
The input file contains several test cases. Each test case consists of seven lines with information as
follows.
Line 1. The integer N (2 ≤ N ≤ 50), which is the number of stations.
Line 2. The integer T (0 ≤ T ≤ 200), which is the time of the appointment.
Line 3. N − 1 integers: t1, t2, . . . , tN−1 (1 ≤ ti ≤ 20), representing the travel times for the trains
between two consecutive stations: t1 represents the travel time between the first two stations, t2
the time between the second and the third station, and so on.
Line 4. The integer M1 (1 ≤ M1 ≤ 50), representing the number of trains departing from the first
station.
Line 5. M1 integers: d1, d2, . . . , dM1 (0 ≤ di ≤ 250 and di < di+1), representing the times at which
trains depart from the first station.
Line 6. The integer M2 (1 ≤ M2 ≤ 50), representing the number of trains departing from the N-th
station.
Line 7. M2 integers: e1, e2, . . . , eM2 (0 ≤ ei ≤ 250 and ei < ei+1) representing the times at which
trains depart from the N-th station.
The last case is followed by a line containing a single zero.
Output
For each test case, print a line containing the case number (starting with 1) and an integer representing
the total waiting time in the stations for a best schedule, or the word ‘impossible’ in case Maria is
unable to make the appointment. Use the format of the sample output.
Sample Input
4
55
5 10 15
4
0 5 10 20
4
0 5 10 15
4
18
1 2 3
5
0 3 6 10 12
6
0 3 5 7 12 15
2
30
20
1
20
7
1 3 5 7 11 13 17
0
Sample Output
Case Number 1: 5
Case Number 2: 0
Case Number 3: impossible

题意:紫书268页,

看着题解搞了一道wf题,爽!

dp[i][j]表示时刻i,在车站j,等待的最少时间
有3种方案:
等一分钟
往左搭车
往右搭车

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAX = ;
int t[MAX],n,T,M1,M2,d1[MAX],d2[MAX];
int has_train[MAX][MAX][],dp[MAX][MAX];
//has_train[i][j][0]表示i时刻在j车站往右走的车,has_train[i][j][1]表示往左行的车
int main()
{
int Case = ;
while(scanf("%d", &n) != EOF && n)
{
scanf("%d", &T);
for(int i = ; i < n; i++)
scanf("%d", &t[i]);
scanf("%d", &M1);
for(int i = ; i <= M1; i++)
scanf("%d", &d1[i]);
scanf("%d", &M2);
for(int j = ; j <= M2; j++)
scanf("%d", &d2[j]);
memset(has_train, , sizeof(has_train));
int sum = ;
//对has_train进行预处理
for(int i = ; i <= M1; i++)
{
sum = d1[i];
has_train[ d1[i] ][][] = ;
for(int j = ; j < n; j++)
{
sum += t[j];
has_train[ sum ][j + ][] = ;
}
}
for(int i = ; i <= M2; i++)
{
sum = d2[i];
has_train[ d2[i] ][n][] = ;
for(int j = n - ; j >= ; j--)
{
sum += t[j];
has_train[sum][j][] = ;
}
}
for(int i = ; i <= n-; i++)
dp[T][i] = INF;
dp[T][n] = ;
//这个第一层循环一定是从大往小循环,假设求i时刻j车站最少时间,在这点有三种情况,考虑往左走的车,那么选了往左走的车之后这一点的时间,前提是选了往左走的车辆,时间肯定是在i之后,由选了往左走的车后推出i,j;所以为什么要递减循环
for(int i = T - ; i >= ; i--)
{
for(int j = ; j <= n; j++)
{
dp[i][j] = dp[i + ][j] + ; //等待一分钟
if(j < n && has_train[i][j][] && i + t[j] <= T) //往右走,j必然要小于n,才能走,i+t[j]表示这一点的时间加上到下一点的时间要小于等于T,如果大于T没意义了,因为是T
{ dp[i][j] = min(dp[i][j], dp[ i + t[j] ][ j + ] );
}
if(j > && has_train[i][j][] && i + t[j - ] <= T)
{
dp[i][j] = min(dp[i][j], dp[ i + t[j - ] ][ j - ] );
}
}
}
printf("Case Number %d: ", ++Case);
if(dp[][] >= INF)
printf("impossible\n");
else
printf("%d\n",dp[][]);
} return ;
}

UVA1025---A Spy in the Metro(DP)的更多相关文章

  1. UVa 1025 A Spy in the Metro (DP动态规划)

    题意:一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短, 也就是尽量多坐车,最后输出最少等待时间. 析:这个挺复杂,首先时间是 ...

  2. uva A Spy in the Metro(洛谷 P2583 地铁间谍)

    A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especially dangero ...

  3. UVA1025 A Spy in the Metro —— DP

    题目链接: https://vjudge.net/problem/UVA-1025 题解: 详情请看紫书P267. 与其说是DP题,我觉得更像是模拟题,特别是用记忆化搜索写. 递推: #include ...

  4. UVa 1025 A Spy in the Metro(动态规划)

    传送门 Description Secret agent Maria was sent to Algorithms City to carry out an especially dangerous ...

  5. UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)

    传送门 参考资料: [1]:算法竞赛入门经典:第九章 DAG上的动态规划 题意: Algorithm城市的地铁有 n 个站台,编号为 1~n,共有 M1+M2 辆列车驶过: 其中 M1 辆列车从 1 ...

  6. World Finals 2003 UVA - 1025 A Spy in the Metro(动态规划)

    分析:时间是一个天然的序,这个题目中应该决策的只有时间和车站,使用dp[i][j]表示到达i时间,j车站在地上已经等待的最小时间,决策方式有三种,第一种:等待一秒钟转移到dp[i+1][j]的状态,代 ...

  7. 【动态规划】[UVA1025]A Spy in the Metro 城市里的间谍

    参考:https://blog.csdn.net/NOIAu/article/details/71517440 https://blog.csdn.net/c20180630/article/deta ...

  8. Uva1025 A Spy in the Metro

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; ]; ] ...

  9. 题解:UVa1025 A Spy in the Metro

    原题链接 pdf 题目大意 给出一张无向图图,求该图的最小瓶颈生成树. 无向图的瓶颈生成树:无向图\(G\)的一颗瓶颈生成树是这样的一颗生成树:它最大的边权值在\(G\)的所有生成树中是最小的.瓶颈生 ...

随机推荐

  1. win7系统电脑连接小米蓝牙音箱

    一.买好蓝牙适配器,插到电脑上. 二.右下角工具栏找到蓝牙图标 三.右键这个图标,选择'显示Bluetooth设备' 四.找到小米蓝牙音箱 'NDZ-030-AA' 五.双击打开它,然后选择'服务'选 ...

  2. android 合并两个jar包

    你所要导出的类里边用到了别的jar包.比如说你写的类连接了数据库,用到数据库驱动包oracl.jar(也就是你导入到Myeclipse或eclipse的jdbc包).. .在dos环境下,进入到D盘的 ...

  3. struts2中简单的文件上传

    2016-08-31 一.       文件上传 利用commons-fileupload-1.2.1.jar实现简单的上传文件,首先在页面上填写表单,记得加上enctype="multip ...

  4. nginx log的json格式:

    nginx log的json格式: 为了elk便于统计: yum安装nginx: log_format json '{"@timestamp": "$time_iso86 ...

  5. [vim]的关键字补全

    除了complete关键字补全,所有补全相关命令都以CTRL-X开始,然后再接与补全类型相关的命令.CTRL-N与CTRL-P在找的的内容中选择的通用的命令,上下选择用的,CTRL-E则是取消选择.( ...

  6. [CareerCup] 8.3 Musical Jukebox 点唱机

    8.3 Design a musical jukebox using object-oriented principles. CareerCup这书实在是太不负责任了,就写了个半调子的程序,说是完整版 ...

  7. HBase入库调优

    本文章只针对“微型集群处理大数据”的场景. 场景描述: 硬件:5个节点,每个节点可用硬盘1块(700G.500G等).8核cpu,实验室环境(有时候还要跑其他程序跟你抢占资源),16G内存. 软件:h ...

  8. IT男的”幸福”生活"续3

    我和MM一进饭店,服务员走过,面带笑容,说:“欢迎,欢迎,两位里面坐.” ...... 谢谢大家的捧场,IT的”幸福”生活.是我的回忆录来着.真实可靠,在写法上有点小说化.可能是我一直看小说的原因吧, ...

  9. Java学习笔记(二十)——Java 散列表_算法内容

    [前面的话] 周末,本来打算找人去玩,结果没找到,所以我只好有学习了. 为什么会学习散列表,因为要使用HashMap?因为在做项目的时候,在服务器和客户端需要传输DTO,而传输的属性是动态增加的,所以 ...

  10. VS2008+GDI实现多幅图像的GIF动画制作

    相信很多朋友和我一样,经常由于这或那的原因,需制作一些特定格式的图像.如开发过程中需要给菜单.工具条及按钮等添加对应的图形标识,通过代码或资源导入方式加载这些图像时往往会有较高的格式要求. 比如,为按 ...