这道题的边界是dp(T,N)=0,状态dp(i,j)表示在时间i、第j个车站最少等待时间,有三个决策:1、等1分钟 2、如果有向左的车,向左 3、若果有向右的车,向右  转移方程就是dp(i,j)=min(dp(i+1,j),dp(i+t[j],j+1),dp(i+t[j-1],j-1))

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=1<<30;
const int maxn=200+5;
int dp[maxn][55];
int time[55],t[55];
int has[12600][55][2]; //has train

int main(){
    int N,T,M1,M2;
    int kase=0;
    while(scanf("%d",&N)==1&&N){
        scanf("%d",&T);
        time[1]=0;
        for(int i=2;i<=N;++i){
            scanf("%d",&t[i]);
            time[i]=time[i-1]+t[i];
        }

        memset(has,0,sizeof(has));
        scanf("%d",&M1);
        for(int i=1;i<=M1;++i){ //right
            int r;
            scanf("%d",&r);
            for(int j=1;j<=N;++j){
                has[r+time[j]][j][0]=1;
            }
        }

        scanf("%d",&M2);
        for(int i=1;i<=M2;++i){
            int l;
            scanf("%d",&l);
            for(int j=N;j>=1;--j){
                has[l+time[N]-time[j]][j][1]=1;
            }
        }

        for(int i=1;i<N;++i) dp[T][i]=INF;
        dp[T][N]=0;
        for(int i=T-1;i>=0;--i)
            for(int j=1;j<=N;++j){
                dp[i][j]=dp[i+1][j]+1;
                if(j<N&&has[i][j][0]&&i+t[j+1]<=T)
                    dp[i][j]=min(dp[i][j],dp[i+t[j+1]][j+1]);
                if(j>1&&has[i][j][1]&&i+t[j]<=T)
                    dp[i][j]=min(dp[i][j],dp[i+t[j]][j-1]);
            }
        printf("Case Number %d: ",++kase);
        if(dp[0][1]>=INF) printf("impossible\n");
        else printf("%d\n",dp[0][1]);
    }
    return 0;
}

若有不当之处欢迎指出!

最新文章

  1. 详解SpringMVC中GET请求
  2. Java项目中的classpath
  3. Material Design UI Widgets
  4. [SQL] Oracle基础语法
  5. 概率论 --- Uva 11181 Probability|Given
  6. Selenium2学习-023-WebUI自动化实战实例-021-获取浏览器显示区域大小,通过 WebDriver 截图功能
  7. java mybatis 框架下多种类型的参数传入到xml问题
  8. Linux有问必答:如何在Linux中修改环境变量PATH
  9. Matlab基础
  10. C++的虚函数表
  11. SSIS -&gt;&gt; Event Handler
  12. Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
  13. Learning Django Resources
  14. git 备份和恢复
  15. [转贴]怎样在LINQ实现 LEFT JOIN 或者RIGHT JOIN
  16. 【UVA1371】Period (二分+DP)
  17. WebRTC介绍及简单应用
  18. 05mycat父子表
  19. office全系列激活脚本-改良版.cmd
  20. 转载:MySQL看这一篇就够了

热门文章

  1. HTML中padding和margin的区别和用法
  2. HotSpot 虚拟机的算法实现
  3. linkin大话面向对象--GC和jar包
  4. jdk源码-&gt;集合-&gt;ArrayList
  5. MySQL模糊查询中通配符的转义
  6. @interface注解类、 @Target:注解的作用目标 @Retention
  7. 05_Javascript进阶第二天
  8. IOS 时间字符串转换时间戳失败问题
  9. iOS-常用三方工具
  10. ABP官方文档翻译 5.2 动态We API层