uva1025 dp

这题说的是给了n个车站 从1号 车站到 n号车站,有m1辆车从1 开往n 有m2 辆车从n 开往1 一个人从1 车站 到达n 车站在T 时刻 要求再 车站呆的时间尽量少

dp[i][j] 表示 在 第i 个车站 j 时刻的 状态 他会从 dp[i][j-1]+1 和j 时刻有到i的火车经过的点来, 这样我们通过计算在j时候有什么火车到达i就可以了 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
int dp[55][250];
int dd[55];
int t[2][55];
int D[2][55];
void inti(int n, int t){
   for(int i=0; i<n; ++i)
     for(int j=0; j<=t; ++j)
         dp[i][j]=t+1;
}
int main()
{
     int N,T,cas=1;
     while(scanf("%d",&N)==1&&N){
           scanf("%d",&T);

           for(int i=1; i<N; ++i)
              scanf("%d",&dd[i]);
              t[0][0]=0;
           for(int i=1; i<N; ++i)
              t[0][i]=t[0][i-1]+dd[i];
           t[1][N-1]=0;
           for(int i=N-2; i>=0; --i)
               t[1][i]=t[1][i+1]+dd[i+1];
           int m1;
           scanf("%d",&m1);
           for(int i=0; i<m1; ++i){
             scanf("%d",&D[0][i]);
           }
           int m2;
           scanf("%d",&m2);
           for(int i=0; i<m2; ++i)
           scanf("%d",&D[1][i]);
           inti(N,T);
           dp[0][0]=0;
           for(int i=1; i<=T; ++i){
                if(i==15) {
                    int ddddddd=1;

                }
               for(int j=0; j<N; ++j){
                   dp[j][i]=min(dp[j][i],dp[j][i-1]+1);
                   for(int e=0; e<m1; e++)
                      if( D[0][e]+t[0][j]==i&&j!=0){
                         for(int k=0; k<j; ++k)
                             dp[j][i]=min(dp[j][i],dp[ k ][ D[0][e]+t[0][k] ]);
                      }
                   for(int e=0; e<m2; e++){
                      if(D[1][e]+t[1][j]==i&&j!=(N-1) ){
                          for(int k=N-1; k>j; --k)
                                dp[j][i]=min(dp[j][i],dp[ k ][ D[1][e] +t[1][k] ]);
                      }
                   }
               }
           }
           printf("Case Number %d: ",cas++);
         if(dp[N-1][T]>T){
              puts("impossible");
         }else{
            printf("%d
",dp[N-1][T]);
         }
     }

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Opaser/p/4077275.html