zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    js1
    curl获取图片
    TP中讲的两种ajax方法
    tp验证码
    TP上传图片
    TP中登录验证
    tp中自定义跳转页面
    用户数据库表状态一类的问题
    用php实现斐波那契数列
    微信的网页授权登陆
  • 原文地址:https://www.cnblogs.com/Opaser/p/4077275.html
Copyright © 2011-2022 走看看