UVA1025---A Spy in the Metro(简单dp)

dp[i][j]表示时刻i,在车站j,等待的最少时间

有3种方案:

等一分钟

往左搭车

往右搭车

/*************************************************************************
    > File Name: uva1025.cpp
    > Author: ALex
    > Mail: [email protected]
    > Created Time: 2015年05月25日 星期一 19时05分09秒
 ************************************************************************/

#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <vector>

using namespace std;

const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;

int dp[220][55];
int t_use[55];
vector <int> go[220][55];

int main() {
    int n, T, icase = 1, times;
    while (~scanf("%d", &n), n) {
        scanf("%d", &T);
        int m1, m2; // m1 : L to R, m2 : R to L
        for (int i = 1; i <= n - 1; ++i) {
            scanf("%d", &t_use[i]);
        }
        for (int i = 0; i <= T; ++i) {
            for (int j = 1; j <= n; ++j) {
                go[i][j].clear(); // time = i, station = j
            }
        }
        scanf("%d", &m1);
        for (int i = 1; i <= m1; ++i) {
            scanf("%d", &times);
            int t = times;
            if (t > T) {
                continue;
            }
            go[t][1].push_back(i);
            for (int j = 1; j <= n - 1; ++j) {
                t += t_use[j];
                if (t > T) {
                    break;
                }
                go[t][j + 1].push_back(i);
            }
        }
        scanf("%d", &m2);
        for (int i = 1; i <= m2; ++i) {
            scanf("%d", &times);
            int t = times;
            if (t > T) {
                continue;
            }
            go[t][n].push_back(i + m1);
            for (int j = n - 1; j >= 1; --j) {
                t += t_use[j];
                if (t > T) {
                    break;
                }
                go[t][j].push_back(i + m1);
            }
        }
        for (int i = 0; i <= T; ++i) {
            for (int j = 1; j <= n; ++j) {
                dp[i][j] = inf;
            }
        }
        dp[0][1] = 0;
        for (int i = 0; i < T; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (dp[i][j] == inf) {
                    continue;
                }
                int size = go[i][j].size();
                dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + 1);
                for (int k = 0; k < size; ++k) {
                    int u = go[i][j][k];
                    if (u <= m1 && j < n) {
                        if (i + t_use[j] <= T) {
                            dp[i + t_use[j]][j + 1] = min(dp[i + t_use[j]][j + 1], dp[i][j]);
                        }
                    }
                    else if (j > 1 && u > m1) {
                        if (i + t_use[j - 1] <= T) {
                            dp[i + t_use[j - 1]][j - 1] = min(dp[i + t_use[j - 1]][j - 1], dp[i][j]);
                        }
                    }
                }
            }
        }
        int ans = inf;
        for (int i = 0; i <= T; ++i) {
            if (dp[i][n] == inf) {
                continue;
            }
            ans = min(ans, dp[i][n] + T - i);
        }
        if (ans == inf) {
            printf("Case Number %d: impossible\n", icase++);
        }
        else {
            printf("Case Number %d: %d\n", icase++, ans);
        }
    }
    return 0;
}
时间: 2024-10-31 12:12:54

UVA1025---A Spy in the Metro(简单dp)的相关文章

UVA 1025 A Spy in the Metro(DP)

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 s

UVA1025---A Spy in the Metro(DP)

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. Afterseveral thrilling events we ?nd her in the ?rst station of Algorithms City Metro, exam

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

题意:一个间谍要从第一个车站到第n个车站去会见另一个,在是期间有n个车站,有来回的车站,让你在时间T内时到达n,并且等车时间最短, 也就是尽量多坐车,最后输出最少等待时间. 析:这个挺复杂,首先时间是一个顺序,设d(i,j)表示时刻 i 在第 j 个车站,最少还要等待多长时间,那么边界是d(T, n) = 0. 并且有三种决策: 决策一:等着 d[i][j] = d[i + 1][j] + 1; 为什么从i + 1 过来呢? 你想一下,DP表示等待的时间,那么是不是应该倒着来呢? 决策二:有往右

UVA1025 A Spy in the Metro

题解: dp[i][j]表示在i时刻,在车站j.可以往哪行动 预处理一下每个时刻,每个车站是否有车 有3个决策 1.等1分钟 dp[i][j]=dp[i+1][j]+1 2.向左 dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]) 3.向右 dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]) 初始状态是dp[T][n]=0; 代码: #include<bits/stdc++.h> using namespace std; #define

UVA 1025 A Spy in the Metro(DAG dp)

UVA 1025 1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<vector> 5 #include<stack> 6 #include<set> 7 #include<string> 8 #include<cstring> 9 #include<math.h> 10 #include<algorith

题解:UVa1025 A Spy in the Metro

原题链接 pdf 题目大意 给出一张无向图图,求该图的最小瓶颈生成树. 无向图的瓶颈生成树:无向图\(G\)的一颗瓶颈生成树是这样的一颗生成树:它最大的边权值在\(G\)的所有生成树中是最小的.瓶颈生成树的值为\(T\)中最大权值边的权. 该图建立在坐标系中, 给出每个点的坐标.任意两点之间都有边,边权即为两点间的距离. 题解 由于只关心生成树的最大值,我们可以将边从小到大排序,依次加入(若构成环则不加入),直到构成一颗生成树. 相信你已经发现了:这不就是Kruskal算法吗? 于是,我们得出结

UVA 1025 A Spy in the Metro DP

DP[ i ][ j ] 在 i 时刻 j 号车站的等待最小时间..... 有3种可能: 在原地等,坐开往左边的车,做开往右边的车 A Spy in the Metro Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Secret agent Maria was sent to Algorithms City to carry out an es

UVA 1025 A Spy in the Metro

A Spy in the Metro #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("%

洛谷2583 地铁间谍 (UVa1025A Spy in the Metro)

洛谷2583 地铁间谍(UVa1025A Spy in the Metro) 本题地址:http://www.luogu.org/problem/show?pid=2583 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车 站,她会有很大的被抓的风险,躲在运行的列车中是比较安全的.