UVA 1025_A Spy in the Metro

2610 단어 uvaACM_동적 기획
[제의] (소자서) 한 사람이 플랫폼 1에서 출발하면 차를 타려면 시간 T에 플랫폼 n에 도착해야 한다. 플랫폼에서 차를 기다리는 시간이 가장 짧기 때문에 그녀는 두 방향의 열차를 타고 버스가 정차할 때 갈아타야 한다.
[분석] 정류장에서 내릴 때마다 그녀는 세 가지 선택을 한다.제자리에서 움직이지 않다.오른쪽으로 가는 차를 타세요.왼쪽으로 가는 차에 탑승하다.d[i][j]는 플랫폼 i에서 시간 j의 최소 대기 시간을 나타낸다.
상태 전환 방정식:
대기: dp[i][j]=dp[i][j+1]+1;
오른쪽으로 가는 차가 있다면: dp[i][j]=min(dp[i][j], dp[i+1][j+t[i]]);
왼쪽으로 가는 차가 있다면: dp[i][j]=min(dp[i][j], dp[i-1][j+t[i-1]));
참고:
1. 어느 시점에 어느 역에 차가 있는지, 3차원 그룹을 사용할 수 있습니다has트랙으로 기록해.
2. 경계 조건 dp[N][T]=0
【코드】
#include<cstdio>
#include<cstring>
#define min(a,b)  (a)<(b)?(a):(b)
const int maxn=250;
const int INF=0xfffffff;
int has_train[55][250][2];
int t[250];
int d[55];
int e[55];
int dp[50][200];
int main (void)
{
    int N,T,total,M1,M2,c=0;
    while(scanf("%d",&N)==1&&N)
    {
        memset(has_train,0,sizeof(has_train));
        scanf("%d",&T);
        for(int i=1;i<=N-1;i++) scanf("%d",&t[i]);
        scanf("%d",&M1);
        for(int i=1;i<=M1;i++)
        {
            scanf("%d",&d[i]);
            total=0;
            has_train[1][d[i]][0]=1;
            for(int j=1;j<=N-1;j++)
            {
                total+=t[j];
                if(d[i]+total<=T)
                     has_train[j+1][d[i]+total][0]=1;
                else break;
            }
        }
        scanf("%d",&M2);
        for(int i=1;i<=M2;i++)
        {
            scanf("%d",&e[i]);
            total=0;
           has_train[N][e[i]][1]=1;
            for(int j=N-1;j>=1;j--)
            {
                total+=t[j];
                if(e[i]+total<=T)
                    has_train[j][e[i]+total][1]=1;
                else break;
            }
        }
        for(int i=1;i<=N;i++)
            for(int j=0;j<=T;j++)
                dp[i][j]=INF;
        dp[N][T]=0;
         for(int j=T-1;j>=0;j--)
        {
            for(int i=1;i<=N;i++)//i  j  
            {
                dp[i][j]=dp[i][j+1]+1;
                if(j+t[i]<=T&&has_train[i][j][0]&&i<N)
                    dp[i][j]=min(dp[i][j],dp[i+1][j+t[i]]);
                if(j+t[i-1]<=T&&has_train[i][j][1]&&i>1)
                    dp[i][j]=min(dp[i][j],dp[i-1][j+t[i-1]]);
            }
        }
        if(dp[1][0]>=INF)
                printf("Case Number %d: impossible
",++c); else printf("Case Number %d: %d
",++c,dp[1][0]); } return 0; }



좋은 웹페이지 즐겨찾기