码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-27 21:58:55      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

  分析:时间是一个天然的序,这个题目中应该决策的只有时间和车站,使用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(动态规划)

标签:

原文地址:http://www.cnblogs.com/jifahu/p/5813760.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!