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

Posted icode-xiaohu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了World Finals 2003 UVA - 1025 A Spy in the Metro(动态规划)相关的知识,希望对你有一定的参考价值。

  分析:时间是一个天然的序,这个题目中应该决策的只有时间和车站,使用dp[i][j]表示到达i时间,j车站在地上已经等待的最小时间,决策方式有三种,第一种:等待一秒钟转移到dp[i+1][j]的状态,代价为1。第二种:如果可以则向右上车,转移到dp[i+t][j+1],无代价,t为列车行驶时间。第三种与第二种相同。初始状态为dp[0][1] = 0,其他为INF。答案为dp[T][n]。

  代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define N 55
#define INF 1e9
bool gol[N][N*4],gor[N][N*4];
int dp[N*4][N];
int main()
{
    int n,T,t[N],m1,m2,d,e,sum,ans,ca=0;
    while(cin>>n && n)
    {
        cin>>T;
        for(int i = 2; i <= n; i++)
        {
            cin>>t[i];
        }
        memset(gol,false,sizeof(gol));
        memset(gor,false,sizeof(gor));
        cin>>m1;
        for(int i = 0; i < m1; i++)
        {
            cin>>d;
            gor[1][d] = true;
            sum = d;
            for(int j = 2; j <= n; j++)
            {
                sum += t[j];
                gor[j][sum] = true;
            }
        }
        cin>>m2;
        for(int i = 0; i < m2; i++)
        {
            cin>>d;
            gol[n][d] = true;
            sum = d;
            for(int j = n-1; j >= 1; j--)
            {
                sum += t[j+1];
                gol[j][sum] = true;
            }
        }
        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(i+1 <= T) dp[i+1][j] = min(dp[i][j]+1,dp[i+1][j]);
                if(j+1<=n&&gor[j][i]&&i+t[j+1]<=T)dp[i+t[j+1]][j+1]=min(dp[i+t[j+1]][j+1],dp[i][j]);
                if(j-1>=1&&gol[j][i]&&i+t[j]<=T)dp[i+t[j]][j-1]=min(dp[i+t[j]][j-1],dp[i][j]);
            }
        }
        printf("Case Number %d: ",++ca);
        if(dp[T][n] >= INF) ans = -1;
        else ans = dp[T][n];
        if(ans == -1) printf("impossible\n");
        else printf("%d\n",ans);
    }
    return 0;
}

 

以上是关于World Finals 2003 UVA - 1025 A Spy in the Metro(动态规划)的主要内容,如果未能解决你的问题,请参考以下文章

UVa 213,World Finals 1991,信息解码

World Finals 1996 Uva (Floyd求闭包)

[UVa 213]Message Decoding,ACM/ICPC World Finals 1991 信息解码

[算法竞赛入门经典] Crossword Answers ACM/ICPC World Finals 1994,UVa232

[算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213

[算法竞赛入门经典]Repeating Decimals, ACM/ICPC World Finals 1990,UVa202