DAG的动态规划 (UVA 1025 A Spy in the Metro)
第一遍,刘汝佳提示+题解;回头再看!!!
POINT:
dp[time][sta]; 在time时刻在车站sta还需要最少等待多长时间;
终点的状态很确定必然是的 dp[T][N] = 0 ---即在T时刻的时候正好达到N站点
我们可以 从终点的状态往起始的状态转化, 一步步走就可以了。
has_train[t][i][0]; t时刻在i车站是否有往右开的火车
has_train[t][i][1]; t时刻在i车站是否有往左开的火车
- #include <iostream>
- #include <sstream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <string>
- #include <vector>
- #include <set>
- #include <cctype>
- #include <algorithm>
- #include <cmath>
- #include <deque>
- #include <queue>
- #include <map>
- #include <stack>
- #include <list>
- #include <iomanip>
- using namespace std;
- #define INF 0xffffff7
- #define maxn 200+10
- int N, T;
- int t[maxn];
- int dp[maxn][maxn];//dp[i][j] i时刻在j车站最少等候时间
- int has_train[maxn][maxn][];
- int main()
- {
- //freopen("out.txt", "r", stdout);
- int kase = ;
- int N;
- while(scanf("%d", &N) && N)
- {
- memset(has_train, , sizeof(has_train));
- memset(t, , sizeof(t));
- kase++;
- scanf("%d", &T);
- for(int i = ; i < N; i++)
- scanf("%d", &t[i]);
- int M1, M2;
- scanf("%d", &M1);
- for(int i = ; i <= M1; i++)
- {
- int start;
- scanf("%d", &start);
- has_train[start][][] = ; // 标记初始站台
- for(int j = ; j < N; j++)
- {
- int time = start + t[j];
- if(time <= T)
- {
- has_train[time][j+][] = ;
- start += t[j];
- }
- }
- }
- scanf("%d", &M2);
- for(int i = ; i <= M2; i++)
- {
- int start;
- scanf("%d", &start);
- has_train[start][N][] = ; // 标记初始站台
- for(int j = N-; j >= ; j--)
- {
- int time = start + t[j];
- if(time <= T)
- {
- has_train[time][j][] = ;
- //cout << "has[" << time << "][" << j << "][1] " << endl;
- start += t[j];
- }
- }
- }
- printf("Case Number %d: ", kase);
- for(int i = ; i < N; i++)
- dp[T][i] = INF;
- dp[T][N] = ;
- for(int i = T-; i >= ; i--)
- {
- for(int j = ; j <= N; j++)
- {
- dp[i][j] = dp[i+][j] + ; //第T-1时刻在j车站最少等候时间 = 第T时刻在j车站最少等候时间+1; 即决策一---等一分钟
- if(j < N && has_train[i][j][] && i + t[j] <= 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-]);
- }
- }
- }
- if(dp[][] >= INF) printf("impossible\n");
- else printf("%d\n", dp[][]);
- }
- return ;
- }
DAG的动态规划 (UVA 1025 A Spy in the Metro)的更多相关文章
- UVA - 1025 A Spy in the Metro[DP DAG]
UVA - 1025 A Spy in the Metro Secret agent Maria was sent to Algorithms City to carry out an especia ...
- UVA 1025 -- A Spy in the Metro (DP)
UVA 1025 -- A Spy in the Metro 题意: 一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短, ...
- uva 1025 A Spy in the Metro 解题报告
A Spy in the Metro Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebug Secr ...
- UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)
传送门 参考资料: [1]:算法竞赛入门经典:第九章 DAG上的动态规划 题意: Algorithm城市的地铁有 n 个站台,编号为 1~n,共有 M1+M2 辆列车驶过: 其中 M1 辆列车从 1 ...
- UVa 1025 A Spy in the Metro(动态规划)
传送门 Description Secret agent Maria was sent to Algorithms City to carry out an especially dangerous ...
- UVA 1025 A Spy in the Metro 【DAG上DP/逆推/三维标记数组+二维状态数组】
Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After s ...
- World Finals 2003 UVA - 1025 A Spy in the Metro(动态规划)
分析:时间是一个天然的序,这个题目中应该决策的只有时间和车站,使用dp[i][j]表示到达i时间,j车站在地上已经等待的最小时间,决策方式有三种,第一种:等待一秒钟转移到dp[i+1][j]的状态,代 ...
- UVa 1025 A Spy in the Metro (DP动态规划)
题意:一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短, 也就是尽量多坐车,最后输出最少等待时间. 析:这个挺复杂,首先时间是 ...
- uva 1025 A Spy int the Metro
https://vjudge.net/problem/UVA-1025 看见spy忍俊不禁的想起省赛时不知道spy啥意思 ( >_< f[i][j]表示i时刻处于j站所需的最少等待时间,有 ...
随机推荐
- [iOS UI进阶 - 0] Quiartz2D
A.简介 1. 需要掌握的 drawRect:方法的使用 常见图形的绘制:线条.多边形.圆 绘图状态的设置:文字颜色.线宽等 图形上下文状态的保存与恢复 图形上下文栈 1.基本图形绘制* 线段(线宽. ...
- IntelliJ IDEA 开发工具项目maven管理
今天自己重新部署一下intellij下的项目开发环境,顺便把maven管理项目jar包的方法梳理一下 (1)首先下载apache-maven-3.0.4版本的maven,我自己解压在D:\maven\ ...
- Webstorm2016激活码[ 转]
转至:http://blog.csdn.net/tingwode2014_/article/details/51063657 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QT ...
- Objective-c setObject:forKey:和setValue:forKey:的区别
setObject:forKey: 是NSMutableDictionary类的方法 key参数类型可以是任意类型对象 ...
- 使用Unity制作游戏关卡的教程(一)
转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...
- stack对象与heap对象
从高地址到低地址,分别是stack,heap,static object,stack地址往下增长,heap地址往上增长.只要记住:stack栈顶地址反而小,就知道往下增长了. 禁止产生堆对象 1.产生 ...
- POJ1463:Strategic game(树形DP)
Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f ...
- 解决使用DevExpress开发错误:未将对象引用设置到对象的实例
在使用DevExpress是总是会出现一些状况.这次同事在他的机器上调试完成的代码发过来,却出现"未将对象引用设置到对象的实例"的错误,提示是Resources.resx的问题.另 ...
- delphi Edit - TActionList
Edit TEditCut TEditCopy TEditpaste TEditSelectAll TEditUndo TEditDelete 编辑 ...
- 架构师之路(39)---IoC框架
1 IoC理论的背景 我们都知道,在採用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,全部的对象通过彼此的合作,终于实现系统的业务逻辑. 图1:软件系统中耦合的对象 假设 ...